MVC视图没有传递回模型给控制器,奇怪的错误

本文关键字:控制器 错误 模型 视图 MVC | 更新日期: 2023-09-27 18:09:51

这是第二次发生在我身上,我不知道发生了什么。我有一个MVC视图,它是强类型的,并由控制器在模型中使用:

public ActionResult EditSubscription (String subName){
                DutiesWeb.Models.EditSubscriptionViewModel mod = new Models.EditSubscriptionViewModel(subName);
                return View("EditSubscription", mod);
        }

所有内容在编辑页面上显示良好:

@model DutiesWeb.Models.EditSubscriptionViewModel
@{
    ViewBag.Title = "EditSubscription";
}
<h2>EditSubscription</h2>

@using (Html.BeginForm("EditSubscriptionSubmitAction","Home", FormMethod.Post )) {
    <div class="form-horizontal">
        <div class="form-group">
            <div class="col-lg-12">
            </div>
        </div>
        <div class="form-group">
            <div class="col-lg-2">
                @Html.LabelFor(model => model.subscription.subscriptionName, new { @class = "control-label" })
            </div>
            <div class="col-lg-10">
                @Html.TextBoxFor(model => model.subscription.subscriptionName, new { @class = "form-control" })
            </div>
        </div>
        <div class="form-group">
            <div class="col-lg-2">
                @Html.LabelFor(model => model.subscription.messageCount, new { @class = "control-label" })
            </div>
            <div class="col-lg-10">
                @Html.TextBoxFor(model => model.subscription.messageCount, new { @class = "form-control" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-lg-2">
                @Html.LabelFor(model => model.subscription.lastAccessed, new { @class = "control-label" })
            </div>
            <div class="col-lg-10">
                @Html.TextBoxFor(model => model.subscription.lastAccessed, new { @class = "form-control" })
            </div>
        </div>


        <div class="form-group">
            <div class="col-md-2">
                @Html.LabelFor(model => model.subscription.status, new { @class = "control-label" })
            </div>
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.subscription.status,
                (IEnumerable<SelectListItem>)Model.subscriptionActiveOptions,
                "Please Select ...", new { @class = "form-control", @id = "ddlSubscriptionActive" })
                @Html.ValidationMessageFor(model => model.subscription.status)
            </div>
        </div>
        <div class="form-group">
            <div class="col-lg-10 col-lg-offset-2">
                <input type="submit" value="Save Changes" class="btn btn-primary" />
                <input type="button" value="Delete" class="btn btn-danger" />
            </div>
        </div>       
    </div>} <!--Yes, I have remembered the closing bracket-->

但是,每当我尝试使用"保存更改"按钮(或我放在页面上的任何其他提交按钮)提交表单时,我都会得到那些讨厌的IIS白黄相间的错误之一:

No parameterless constructor defined for this object. 
  Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
 Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.

这几乎就好像视图已经忘记了它已经被赋予了一个模型,因为它显然是在寻找在控制器中调用一个带有签名的方法

public ActionResult EditSubscriptionSubmitAction(){}

而不是

public ActionResult EditSubscriptionSubmitAction (DutiesWeb.Models.EditSubscriptionViewModel model) {}

,我不知道为什么。有人有什么想法吗?

MVC视图没有传递回模型给控制器,奇怪的错误

你的模型必须有一个无参数的构造函数。DefaultModelBinder首先需要初始化模型的实例(内部使用Activator.GetInstance()),这需要一个无参数构造函数。

在你的模型

public class EditSubscriptionViewModel
{
  // parameterless constructor
  public EditSubscriptionViewModel()
  {
  }
  public EditSubscriptionViewModel(string subName)
  {
    // set property values
  }
  ....
}

方法EditSubscriptionSubmitAction接受一个类型为EditSubscriptionViewModel的参数,该参数定义了一个构造函数,该构造函数接受一个string参数。

ModelBinder不能实例化这个对象,所以删除构造函数,也许可以考虑用一个属性来代替。

public class EditSubscriptionViewModel
{
    public string SubName { get; set; }
}