【问题标题】:MVC3 Strongly typed partial view model bindingMVC3 强类型局部视图模型绑定
【发布时间】:2011-10-11 03:21:37
【问题描述】:

我有一个强类型视图 Edit,它有一个名为 OrderModel 的模型。在这个视图中,我使用了一个强类型的局部视图,它有一个名为 OrderTypeModel 的模型。包含 jqueryui 自动完成文本框的部分视图 _OrderTypeAutoComplete。如果我用这段代码渲染视图,

public ActionResult Edit(){
    return View();
}

我的编辑视图包含以下 Razor 标记

<div class="editor-field">
    @Html.Partial("_OrderTypeAutoComplete")
    @Html.HiddenFor(model => model.OrderTypeID)
    @Html.ValidationMessageFor(m => m.OrderTypeID)
</div>

我的部分视图包含此剃刀标记

@{
    Layout = null;
}
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.11.min.js")" type="text/javascript"></script>
@Html.AutoCompleteFor(model => model.OrderTypeID, x =>  x.OrderType, "Items","Orders")

当我渲染它时,一切都很好,我的自动完成功能也很好(使用自动完成扩展)。无论如何,我需要在我的初始 OrderModel 中初始化一些东西,所以我将控制器中的代码更改为这个。

public ActionResult Edit(){
    return View(OrderService.GetInitializedOrderModel()); //returns a new OrderModel
}

现在当我渲染视图时,我得到了异常: 传入字典的模型项是“Testing.Models.OrderModel”类型的,但该字典需要一个“Testing.Models.OrderTypeModel”类型的模型项。

在我看来这一行 @Html.Partial("_OrderTypeAutoComplete")

当我没有提供 OrderModel 时,Razor 引擎似乎会为视图创建 OrderModel 并为部分视图创建 OrderTypeModel。这将给出相同的结果。

public ActionResult Edit(){
    return View(new OrderModel())
}

我是 MVC 的新手,所以我不确定这里发生了什么。我只是想在 OrderModel 模型中为我的视图提供一些简单的下拉值,这些值足够小,我不需要 jquery 回发来获取。这就是我在我的模型中为我的编辑操作中的 Http Get 初始化的值。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 你的@Html.Partial("_OrderTypeAutoComplete") 工作正常吗?因为您不传递数据而是部分实现它。怎么样?
  • 它确实有效,但只有当我没有将视图传递给模型以启动时。 Razor 似乎会为视图和局部视图创建模型。如果我为视图提供模型,它会在局部上轰炸。因此,如果我回发并且他们在回发时出现验证错误,那么当页面刷新时它也会失败。
  • 您可以为您的模型类(OrderModel 和 OrderTypeModel)添加代码吗?

标签: asp.net-mvc-3 razor partial-views


【解决方案1】:

示例中缺少模型类的类定义,因此我无法确切说明发生了什么,但是...

@Html.Partial() method 有一些重载:

@Html.Partial(string)
@Html.Partial(string, Object)
@Html.Partial(string, ViewDataDictionary)
@Html.Partial(string, Object, ViewDataDictionary)

前三个重载都只是最后一个重载的“别名” - 说完所有的,它就是最后一个被调用的重载。

当您调用 @Html.Partial(string) 并且不传递模型值或 ViewDataDictionary 时,ASP.NET MVC 将只传递 当前视图 的 ViewDataDictionary(即 this.ViewData)。

换句话说,一个调用:

@Html.Partial(string)

本质上等同于:

@Html.Partial(string, this.ViewData)

...在您的情况下,this.ViewData 的类型为 OrderModel,而不是 OrderModelType

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多