与MVC的混淆以及它如何处理表单



我精通ASP.NET WebForms,并考虑将代码切换到MVC 3。

我正在学习MVC,并且对它有一些理解,但是,有一个问题我还没有理解。

它是这样的:

有了WebForms代码,我就可以有一个DropDownList,当选中它时,它会通过Javascript触发一个按钮按下,这个按钮会触发一个填充另一个DropDown的方法,但两个DropDown都是同一个表单的一部分,并且用户可见的实际按钮(并且将由用户手动按下)触发从这些DropDowns以及其他字段获取值的方法。

问题是,我不知道如何使用MVC来做到这一点。根据我目前的理解,如果我想将表单数据发送到应用程序,它必须遵循模型。这就是为什么我感到困惑的原因(根据我目前的理解),我如何让第一个DropDown只发送第一个DropDown内部的数据?填充另一个下拉列表对MVC来说也有点模糊,但尤其是我对第一个下拉列表的看法是最让我困惑的。

如果有人能在这方面帮助我,我将不胜感激。

了解这里的最大区别在于,ASP.NET MVC中没有老式的回发。

在这种情况下,您可以控制如何为下拉框获取新数据。

当表单完成并且我们准备将数据发送到服务器时,我们将把它作为一种特殊类型发送回我们的控制器方法,但在此之前,我们可以从任何其他控制器方法访问我们需要的数据。

就我个人而言,我会使用jQuery通过向返回JsonResult类型的控制器方法发出ajax请求来实现这一点。

类似于:

$.getJSON("/MyController/GetSecondDropdownValues", function(result) {
 $.each(result, function() {
    $('#mySecondDropdown').append($("<option />").val(this.Name));
});

C#

public JsonResult GetSecondDropdownValues(string initialDropdownValue)
{
   /* Do the work to obtain the values here */
   return Json(returnedValues);
}

Asp.net classic遵循与Asp.net mvc不同的思维方式。第一个尝试模仿桌面表单应用程序,并抽象(隐藏)web平台的详细信息。虽然Asp.netmvc是一个基于mvc的框架,但它实际上是一个"真正的"web框架,因为它不会试图向你隐藏任何与web相关的内容。

也就是说,浏览器提交的数据实际上是"更新模型的数据",而不是模型本身。在大多数教程中,您都会看到视图模型(或其一部分),它会被发送回来,但它只是浏览器提交的数据。asp.net mvc应用程序中的模型有很多混乱之处。

如何让第一个DropDown只发送来自第一个DropDown 内部的数据

你让下拉列表成为表单的唯一元素。在asp.net mvc中,你可以在一个页面中拥有你需要的任意多的表单(只要你不混合它们),asp.net mvc并不遵循web表单的表单思维方式。

或者,您可以通过ajax(使用jQuery)将字段的值提交给控制器,控制器将返回一个json,该json将在客户端进行处理。可能这就是弹出第二个下拉列表的方式,当选择第一个下拉列表时,会向控制器的一个操作发送ajax请求,该操作将第二个列表的内容作为json返回,然后通过javascript插入。

一个简单的提示可以让您更容易地过渡到asp.net mvc:任何与视图相关的东西(html-包括表单、javascript等)都独立于控制器。视图只关心它的(视图)模型,控制器关心它接收的数据。控制器返回一个结果,该结果通常是一个视图,但可以是任何内容。控制器对视图细节(html,js)一无所知,只知道视图数据(视图模型)。

我刚刚想起几年前问的这个问题。另一种方法是将$.get(…)与jQuery(现在已经有了很好的文档…)一起使用

最新更新