.net mvc视图不返回帖子上的模型

时间:2016-04-23 03:06:22

标签: c# asp.net-mvc

在我开始之前,我想说我搜索过,发现没有类似的东西 在我的解决方案中,我有一个包含我的一些对象列表的模型

public class ModelView
{
    public Owner owner = new Owner();
    public Tenant tnt = new Tenant();
}

在我看来,我将这个类称为模型就是这样

@model WebApp.Models.ModelView

<form name="export_form" action="Export" method="post">
    <table cellpadding="2" cellspacing="2" border="0">
        @if (Condition_1)
        { 
            <tr>
                <td>
                    <!-- ID -->
                </td>
                <td>
                    @Html.HiddenFor(model => model.owner.ID)
                </td>
            </tr>
            <tr>
                <td>
                    Name
                </td>
                <td>
                    @Html.EditorFor(model => model.owner.name)
                </td>
            </tr>
            <tr>
                <td>
                    Phone
                </td>
                <td>
                    @Html.CheckBoxFor(model => model.owner.is_Checked_Phone)
                </td>
            </tr>
        }
        else 
        {
            <tr>
                <td>
                    <!-- ID -->
                </td>
                <td>
                    @Html.HiddenFor(model => model.tnt.ID)
                </td>
            </tr>
            <tr>
                <td>
                    Name
                </td>
                <td>
                    @Html.EditorFor(model => model.tnt.name)
                </td>
            </tr>
            <tr>
                <td>
                    Adress
                </td>
                <td>
                    @Html.CheckBoxFor(model => model.tnt.is_Checked_Adress)
                </td>
            </tr>
        }
    </table>
    <input type="submit" name="SaveStuff" value="Save" />
    <input type="submit" name="ExportStuff" value="Export" />
</form>

在我的控制器中,我有一个处理多个提交按钮的类,根据按钮名称,它会重定向到一个方法。以下是SaveStuff方法

    [HttpPost]
    [SubmitButtonClass(Name = "SaveStuff")]
    public ActionResult Save_Definition(Owner owner, Tenant tnt) 
    {
        /*
          Stuff Here
        */
    }

这里的问题是即使实体不为空,我仍然会得到空值。有原因吗?没有返回任何值。

更新
模型A

 public partial class Owner
{
    public long ID { get; set; }
    public bool is_Checked_Name { get; set; }
    public bool is_Checked_Phone { get; set; }
}

模型B

 public partial class Tenant
{
    public long ID{ get; set; }
    public bool is_Checked_Name { get; set; }
    public bool is_Checked_Adress { get; set; }
}

这些是使用EF

自动生成的

2 个答案:

答案 0 :(得分:0)

您的代码存在多个问题。首先,视图中的模型为ModelView,并生成前缀为该模型属性名称的表单控件,例如

<input type="checkbox" name="owner.is_Checked_Phone" ... />

这意味着您的POST方法需要与视图中的模型匹配

public ActionResult Save_Definition(ModelView model)

下一个问题是,您的模型只包含字段,而不是{ get; set; }的属性,因此DefaultModelBinder无法设置任何值。您的视图模型需要public Owner owner { get; set; }等属性,并且在将模型传递给视图之前在控制器中设置值,或者在ModelView的无参数构造函数中设置值。

但是,视图模型不应包含属于数据模型的属性,而应该是仅包含所需属性的平面结构。在你的情况下,它将是

public class ModelView
{
    public long ID { get; set; }
    [Display(Name = "Name")]
    public bool IsNameSelected { get; set; }
    [Display(Name = "Phone")]
    public bool IsPhoneSelected { get; set; }
    [Display(Name = "Address")]
    public bool IsAddressSelected { get; set; }
    // additional property to define if the form is for an Owner or Tenant
    public bool IsOwner { get; set; }
}

和GET方法

var model = new ModelView()
{
    IsOwner = true // or false
};
return View(model);

并在视图中

@model ModelView
....
@using (Html.BeginForm("Save_Definition"))
{
    @Html.HiddenFor(m => m.ID)
    @Html.HiddenFor(m => m.IsOwner)
    @Html.CheckBoxFor(m => m.IsNameSelected )
    @Html.LabelFor(m => m.IsNameSelected )
    if (Model.IsOwner)
    {
        @Html.CheckBoxFor(m => m.IsPhoneSelected)
        @Html.LabelFor(m => m.IsPhoneSelected)
    }
    else
    {
        @Html.CheckBoxFor(m => m.IsAddressSelected)
        @Html.LabelFor(m => m.IsAddressSelected)
    }
    .... // submit buttons
}

以及POST方法,您可以查看model.IsOwner的值,了解您是否已提交OwnerTenant并采取相应措施。

附注:

  1. 建议您阅读What is ViewModel in MVC?
  2. <table>元素用于表格数据。不要将它用于布局。
  3. 您的观点有<form action="Export" .. >但您的POST方法是 名为Save_Definition,因此不确定您打算采用哪种方法 将表格提交给。

答案 1 :(得分:0)

如果您的后控制器正在更改原始模型数据,则需要发出ModelState.Remove(“ propertyname”),然后发出model.propertyname =“ new value”,然后简单的return View(model)将更新更改的内容您已经发布的视图的价值。