MVC3强类型部分视图模型绑定

3

我有一个强类型视图,名称为Edit,其中使用了一个名为OrderModel的模型。在这个视图中,我使用了一个名为OrderTypeModel的模型的强类型局部视图。该局部视图是_OrderTypeAutoComplete,其中包含一个jqueryui自动完成文本框。如果我使用以下代码呈现视图:

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

我的编辑视图包含以下的Razor标记:
<div class="editor-field">
    @Html.Partial("_OrderTypeAutoComplete")
    @Html.HiddenFor(model => model.OrderTypeID)
    @Html.ValidationMessageFor(m => m.OrderTypeID)
</div>

我的部分视图包含这个Razor标记

@{
    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,并且为局部视图创建OrderTypeModel。这将得到相同的结果。
public ActionResult Edit(){
    return View(new OrderModel())
}

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

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


你的 @Html.Partial("_OrderTypeAutoComplete") 正常工作吗?因为你没有传递数据,而是在partial中实现的。怎么做? - Nuri YILMAZ
它确实可以工作,但只有当我不传递模型给视图时才能正常启动。看起来Razor会为View和Partial View创建模型。如果我向视图提供了一个模型,那么它就会在Partial上出错。因此,如果我回发并且回发时存在验证错误,则在页面刷新时也会失败。 - Jeff Reddy
你能添加你的模型类(OrderModel和OrderTypeModel)的代码吗? - Jess Chadwick
1个回答

13

从示例中可以看出,你的模型类的类定义缺失,因此我无法确定具体情况,但是...

@Html.Partial() 方法有几个重载:

@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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接