【问题标题】:Error when send request from partial view从部分视图发送请求时出错
【发布时间】:2012-07-16 18:08:29
【问题描述】:

我正在尝试学习 MVC 的基础知识(NerdDinner 教程)。我已经定义了一个模型:

public class DinnerFormViewModel
{

    // Properties
    public Dinner Dinner { get; private set; }

    public SelectList Countries { get; private set; }

    // Constructor
    public DinnerFormViewModel(Dinner dinner)
    {
        Dinner = dinner;
        Countries = new SelectList(PhoneValidator.Countries, dinner.Country);
    }
}

我定义了一个局部视图:

 @model MyNerddiner.Models.DinnerFormViewModel



 @using (Html.BeginForm()) {
 @Html.ValidationSummary(true)
 <fieldset>
    <legend>Dinner</legend>

    @Html.HiddenFor(model => model.Dinner.DinnerID)
    <div class="editor-label">
        @Html.LabelFor(model => model.Dinner.Title)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Dinner.Title)
        @Html.ValidationMessageFor(model => model.Dinner.Title)
    </div>
</fieldset>
}

从通常的视图加载:

 @model MyNerddiner.Models.DinnerFormViewModel
 @{
   ViewBag.Title = "Create";
 } 
 <div id="Create" > 
 <h2>Host a Dinner</h2>

   @Html.Partial("_DinnerForm")

 </div>

控制器:

public ActionResult Create()
{

    Dinner dinner = new Dinner()
    {
        EventDate = DateTime.Now.AddDays(7)
    };
    return View(new DinnerFormViewModel(dinner));
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(DinnerFormViewModel dinnerViewModel)
{
    Dinner dinner = null;
    if (ModelState.IsValid)
    {
        try
        {
            dinner = dinnerViewModel.Dinner;
            UpdateModel(dinner);
            dinnerRepository.Add(dinner);
            dinnerRepository.Save();

            return RedirectToAction("Details", new { id = dinner.DinnerID });
        }
        catch
        {
            ModelState.AddRuleViolations(dinner.GetRuleViolations());
            return View(dinner);
        }
    }
    return View(new DinnerFormViewModel(dinner));
}

现在,当我尝试创建(在回发时)时,出现错误:

没有为此对象定义无参数构造函数。

我可以猜测这是因为程序试图在某个地方启动DinnerFormViewModel,但是我应该在哪里、为什么以及如何使它正确?

【问题讨论】:

    标签: asp.net-mvc model partial-views


    【解决方案1】:

    MVC 框架需要您的视图模型有一个不带参数的构造函数,以便它可以创建一个空实例来填充来自请求的数据。 DinnerFormViewModel 没有实现没有参数的构造函数,添加一个,这将解决您的问题。

    【讨论】:

    • 谢谢,但即使在创建了另一个无参数的 DinnerFormViewModel 构造函数之后,我也遇到了同样的错误。现在它发生在 linq 生成的类中的某个地方。
    • 顺便问一下:为什么要创建一个空实例来填充来自请求的数据,而该实例已经在第一次路由中创建?
    • 只有当路由在请求中找到与预期方法参数匹配的模式时,才会创建实例。
    • 您的模型层次结构中是否还有另一个没有无参数构造函数的对象?
    • 当我试图在 httpPost 而不是 Dinner 中获取 DinnerFormViewModel 时可能是我错了
    【解决方案2】:

    嗯,找到问题了,和model和constructor无关。

    问题是视图包含以下行: @Html.DropDownListFor(model => model.Countries, Model.Countries) @Html.ValidationMessageFor(model => model.Countries) 当我检查异常来自哪里时,因为国家/地区值为空。

    我改变之后 模型 => 模型.国家 到 model => model.Dinner.Country

    异常停止抛出

    我很高兴我自己解决了这个问题!

    【讨论】:

      猜你喜欢
      • 2021-05-24
      • 2020-10-10
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 2020-12-08
      • 2014-05-22
      相关资源
      最近更新 更多