ASP.NET上的HTTPPost上为null

时间:2013-05-11 10:37:24

标签: c# asp.net-mvc model null http-post

我的问题是这样的,我试图在用表格封装后从视图中获取模型对象,模型看起来像这样:

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不是完全为null,只是列表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>
}

Doest任何人都知道为什么会这样?我做错了什么(我确定我是:)。)

每个人

1 个答案:

答案 0 :(得分: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属性并对值进行硬编码(或从配置文件或类似文件中提取它们)。< / p>

至于获取所选的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 不属于,这是您视图的模型,仅此而已。