【问题标题】:MVC View not passing back model to controller, weird error?MVC View 没有将模型传回控制器,奇怪的错误?
【发布时间】:2015-08-26 13:58:23
【问题描述】:

这是我现在第二次发生这种情况,我不知道发生了什么。我有一个 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.

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

public ActionResult EditSubscriptionSubmitAction(){}

而不是

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

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

【问题讨论】:

  • 感谢 Stephen Muecke 和 Ric,问题现已解决。我以前没有听说过“必须有无参数构造函数”约束,但仔细想想,它确实很有意义。由于对 GetInstance() 的引用,给了斯蒂芬的功劳,但任何一个答案都应该得到道具,因为它们都帮助我解决了问题。感谢您的宝贵时间。
  • 还有另一种方法可以解决这个问题,它是创建一个自定义模型绑定器,看看它,很高兴答案有帮助。

标签: c# asp.net-mvc


【解决方案1】:

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

在你的模型中

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

【讨论】:

    【解决方案2】:

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

    ModelBinder 无法实例化此对象,因此请移除构造函数并考虑改为使用属性。

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

    【讨论】:

      猜你喜欢
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 2016-02-29
      • 2014-02-19
      • 1970-01-01
      相关资源
      最近更新 更多