1

我的问题是这样的,我试图从一个视图中获取一个模型对象,然后使用一个表单,模型看起来像这样:

public class PackageModel
{
    public PackageDTO Package { get; set; }

    public IEnumerable<SelectListItem> Allcategories { get; set; }

}

而 PackageDTO 只是一个包含许多属性的 DTO 对象。现在这个模型的视图,只是显示属性,这个模型将在 httppost 请求中正常发送到索引页面(在那里它将被处理并保存),控制器中的索引方法看起来像这样:

 [HttpPost]
    public ActionResult Index(PackagemODEL packageModel, FormCollection form)
    {

    }

现在我不知道我做错了什么,但是 Object packageModel 并不完全为空,只是列表 Allcategories 和 PackageDTO 对象中的另一个字符串属性,其余的似乎都在工作。

该视图包含此代码

<fieldset>
<legend>@Resources.AppvManagementService_EditPackage_Title</legend>
@using (Html.BeginForm("Index","WantedController",FormMethod.Post,new {enctype="multipart/form-data"}))
{

    @Html.ValidationSummary()

    <labelName </label>@Html.TextBoxFor(model=>model.Package.Name) <br/>
    <label>Sid </label>@Html.TextBoxFor(model=>model.Package.Sid,new {@disabled="disabled"}) <br/>
    <label>Category </label>@Html.DropDownList("CategoryName",Model.Allcategories,Model.Package.Category)<br/>

    <label>Description: </label>@Html.TextBoxFor(model=>model.Package.Description) <br/>


    <label>Type: </label>@Html.TextBoxFor(model=>model.Package.Type) <br/>

    <button type="submit">submit</button>
}

有谁知道为什么会这样?我做错了吗(我确定我是:))

谢谢每一个人

4

1 回答 1

1

您希望如何Allcategories填充?您的视图包含一个字段,该字段在名称下发布一个值"CategoryName"- 您的视图中没有任何内容填充类别列表。更重要的是; 你真的需要填充它吗?在我看来,Allcategories只有在视图中填充下拉列表才是真正需要的。在帖子上,你不应该需要它。如果您仍然需要它,您将不得不:

HttpPost方法的控制器中重新填充它:

[HttpPost]
public ActionResult Index(PackagemODEL packageModel, FormCollection form)
{
    packageModel.Allcategories = new IEnumerable<SelectListItem>();
}

用无意义的隐藏字段使您的视图混乱以将值传回(除非您确实需要,否则我不建议将此用于项目列表):

@for (int i = 0; i < Model.Allcategories.Count; i++)
{
    @Html.HiddenFor( m => m.Allcategories[i])
}

在模型构造函数中填充它:

public class PackageModel
{
    public IEnumerable<SelectListItem> Allcategories { get; set; }

    public PackageModel()
    {
       Allcategories = new IEnumerable<SelectListItem>();
       /* Add values  to Allcategories here */
    }
}

如果 的值Allcategories没有改变,您还可以考虑将其作为static readonly模型的属性并对值进行硬编码(或从配置文件或类似文件中提取它们)。

至于取回选定的 CategoryName,您需要模型中的一个字段来存储它,否则目前访问它的唯一方法是通过Request.Form

public class PackageModel
{
    public IEnumerable<SelectListItem> Allcategories { get; set; }
    public string CategoryName { get; set; }
}

@Html.DropDownListFor(m => m.CategoryName, Model.Allcategories, Model.Package.Category)

顺便说一句:请,请,从您的模型中取出您的 DTO,并在您的模型中设置适当的属性。您的 DTO不属于您的视图模型,它是您的视图模型,仅此而已

于 2013-05-11T10:59:54.063 回答