如何使用ASP.NET MVC 3在回发期间保留文本

时间:2011-10-15 00:31:02

标签: asp.net-mvc asp.net-mvc-3

我有一个产品编辑屏幕。用户可以选择产品的供应商。为此,我显示了一个jQueryUI对话框,允许他们浏览并选择供应商。当用户选择供应商时,我会在页面上更新隐藏的VendorID输入,这是我页面模型的一部分。我还更新了几个div,其中包含有关他们选择的供应商的详细信息。这些仅用于显示目的 - 只需要id来保留选定的供应商。

除非在回发时出现错误,否则这一切都可以正常工作,在这种情况下我会重新显示相同的视图。 ModelState负责保留所有表单字段(包括隐藏的VendorID)。但是,我的带有供应商文本的div(当然)是空的,因为它们没有发布到服务器上。

我首先介绍了为每个供应商显示字段创建隐藏字段并将其放在模型上的路径。然后隐藏的字段在回发中存活,但这并不能解决实际重新显示屏幕上文本的问题。

我能想到的三个选项是:

  1. 在回发时,如果出现错误,请转到数据库,使用提供的VendorID获取供应商,然后使用我想要显示的文本重新填充模型。
  2. 使用RenderAction并执行操作以呈现所选供应商的详细信息。
  3. 使用只读文本框而不是div来显示供应商详细信息。
  4. 这些都不是让我感到非常满意。我觉得我可能错过了一个明显的解决方案。有没有更好的解决方案?

1 个答案:

答案 0 :(得分:3)

我建议您不要将额外的供应商信息作为主页的一部分。创建一个javascript函数showVendorInfo()。调用时,如果VendorID隐藏输入具有值,则它通过AJAX获取相关的供应商信息并使用AjaxGetVendorInfo操作方法显示它。从两个地方调用此函数:

  • 在document.ready()
  • 在使用jQueryUI显示选择供应商后。

现在,这将是一个动作方法。如果您希望用户遇到延迟问题,可以执行以下操作以避免一些ajax调用:在视图中检查您是否知道VendorID;如果是这样,调用Html.RenderAction从视图中调用相同的AjaxGetVendorInfo操作方法。

这样做的一个好处就是它避免了我发现的大禁忌:在ViewModel中包含仅显示值和模型绑定值。这使得ViewModel非常混乱,尤其是在存在验证错误时。 [获取肥皂盒]最好让您的ViewModel具有适用于您的状态的模型绑定属性。将列表值,额外显示信息等放入ViewData或通过AJAX显示它们。