【问题标题】:Model object passed to HttpPost action is having null values传递给 HttpPost 操作的模型对象具有空值
【发布时间】:2013-08-22 05:40:23
【问题描述】:

我有一个声明了属性的模型,控制器动作。并使用指定的 Viewmodel 查看。 我在表单中填写数据并提交,但模型的所有属性都只有空值。如果我尝试使用视图模型,我会在 HttpPost 操作中得到相同的空值。 我的模特:

public class Supplier
{
    public string SupplierSequenceNumber { get; set; }

    public string SupplierName { get; set; }

    public string SupplierActive { get; set; }
}

我的控制器:

[HttpGet]
    public ActionResult Add()
    {
        SupplierVM objSupplierVM = new SupplierVM();
        return View(objSupplierVM);
    }

    [HttpPost]
    public ActionResult Add(Supplier objSupplier)
    {
        return View();
    }

我的观点:

 @model AIEComm.ViewModel.SupplierVM
 @using (Html.BeginForm("Add", "Supplier", FormMethod.Post, new { id = "formAddSupplier" }))
{
   <div class="control-group">
            @Html.LabelFor(m=>m.objSupplier.SupplierName, new{@class = "control-label"})
             <div class="controls">
             @Html.TextBoxFor(m => m.objSupplier.SupplierName, new { placeholder = "Swatch Style" })
             @Html.ValidationMessageFor(m=>m.objSupplier.SupplierName)
             </div>
           </div>
           <div class="control-group">
            @Html.LabelFor(m=>m.objSupplier.SupplierActive, new{@class = "control-label"})
             <div class="controls">
             @Html.DropDownListFor(m=>m.objSupplier.SupplierActive,new SelectList(AIEComm.Models.Utilities.YesNoSelectList,"Value","Text"),new{@class=""})
             @Html.ValidationMessageFor(m=>m.objSupplier.SupplierName)
             </div>
           </div>
           <div class="control-group">
               <div class="controls">
                  <input type="submit" class="btn btn-primary" id="btnSubmit" value="Add"/>
               </div>
           </div>
}

【问题讨论】:

    标签: c#-4.0 asp.net-mvc-4


    【解决方案1】:

    原因是如下代码:

    m => m.objSupplier.SupplierName
    

    您正在使用 ViewModel 中的模型生成 HTML 元素。这是一个很好的方法,您的问题可以很容易地解决。

    这是一个很好的方法,因为你让事情井井有条,但它不起作用,因为上面的代码说:

    好的,使用ViewModel 对象(m),获取objSupplier 对象,然后使用SupplierName 属性。

    这很好,但是当您提交数据时,您是在说(对操作):

    您好,我有一个SupplierName 属性。请将其放入您可以在ViewModel 对象中找到的objSupplier 对象中。

    动作说“嗯,我期待一个objSupplier 对象,但是你说的这个 ViewModel 是什么?”

    一个简单的解决方案是创建一个新的局部视图来生成您的表单。它的模型类型应该是:

    _SupplierForm.cshtml

    @model Supplier
    
    @* // The Form *@
    

    在您的 View 中,继续使用相同的 ViewModel,但传入正确的供应商模型:

    @model AIEComm.ViewModel.SupplierVM
    
    @Html.Partial("_SupplierForm", Model.objSupplier)
    

    【讨论】:

    • 嘿,我通过在 Viewmodel 中声明模型和实用程序的属性来使其工作。不好吗?
    • 也可以。我更喜欢您的原始技术(根据我的建议),因为它将模型分开并保持清洁。不过只是我的偏好。
    猜你喜欢
    • 2019-05-18
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2014-07-04
    相关资源
    最近更新 更多