在HTTP GET请求MVC3模型绑定?(MVC3 Model binding in HTTP GE

2019-09-21 05:55发布

如果没有定制,我可以做在MVC 3这样的事情?

    [HttpGet]
    public ViewResult MyAction(ViewModel model)
    {
        // Do stuff
        return View("ViewName", model);
    }

我这样做的原因是为了在不同页面间的数据传递作为工作流的一部分。 (即,当用户fnishes我们所需要的在步骤1中,通过将表单数据到步骤2 ...)

Answer 1:

只要你有相同的参数名称作为模型类的属性名的,将工作

假设你的类是这样的

public class ViewModel
{
  public string Name { set;get;}
  public string Loc{ set;get;}
}

你可以这样做Get请求

MyAction?Name=jon&Loc=America


Answer 2:

你能行的; 它会在查询字符串中的任何值自动绑定到与名称匹配的属性。

这就是说,它不是东西是一般都做; 它的[HttpPost]的方法在此可以看到绑定进行的模型,作为两个动作的接口需要不同的莫名其妙。 您可以解决通过张贴回不同的动作名称,但你仍然可以在模型上,这将是非常令人困惑用户的(部分)负荷触发模型验证错误。



Answer 3:

Shyju的回答只有一流的端点的方法签名成员只包含标性工程。 但是,如果你有嵌套类? 让我们假设你的ViewModel类如下所示:

public class ViewModel
{
    public string Name { get; set; }
    public string Title { get; set; }
    public Address MyAddress { get; set; }
}

Address类看起来是这样的:

public class Address
{
    public string Line1 { get; set; }
    public string Line2 { get; set; }
}

现在,让我们说,GET请求通过AJAX做,你做了这样的事情在JavaScript:

var address = {
  Line1: "123 Nowhere St.",
  Line2: "Apt. B5"
}
var getRequestData = {
  Name: "Joe",
  Title: "Manager",
  MyAddress: address
}
var uriString = $.param(getRequestData); //the parameters for the GET request
$.get("/ViewResult?" + uriString, function (data) { /*callback function*/ });

即使你的形状address在JavaScript对象的C#完全匹配Address在端点的方法签名类中, Line1Line2的子属性将不会绑定。 它们的值会通过为null

有两种方法可以解决此。

解决方法1:

第一个是在GET请求中,而不是嵌套JavaScript对象命名的参数时使用的点表示法。 使用这种方法,在AJAX的GET请求的数据是这样的:

var getRequestData = {
  Name: "Joe",
  Title: "Manager",
  MyAddress.Line1: "123 Nowhere St.",
  MyAddress.Line2: "Apt. B5"
}

MVC模型绑定会知道如何做到这一点,只要所有符合你所有的属性名称(他们是区分大小写的,所以要小心)。

如果你不使用AJAX,而只是一个普通的HTML表单提交,那就更简单了。 仅举与相同点符号的输入元素。 剃刀语法使得这真的辅助方法一样容易TextBoxFor()但这里的纯HTML的例子:

<form method="get" action="/ViewResult">
  <input type="text" name="Name" />
  <input type="text" name="Title" />
  <input type="text" name="MyAddress.Line1" />
  <input type="text" name="MyAddress.Line2" />
  <button type="submit">Submit GET request</button>
</form>

解决方法2:

解决这个问题的另一种方法是简单地使用POST请求,而不是GET。 要注意的是在技术上不好的做法来执行,而不实际改变在服务器端的一些数据的意图POST请求,但它是一个选项。



Answer 4:

您可以通过设置发布形式于获取PostMethod属性来获得。 如果表单的输入域匹配任何接受的ViewModel那么他们将被填补。 这些匹配由所确定的name字段中的输入端( <input name="MatchedField"> - > public string MatchedField { get; set; }

你应该做的是从后传的形式,然后重定向到从岗位动作搞定。 这种模式是最好的做法,是被称为后重定向消息获取模式。



Answer 5:

我会建议对这一做法。 最好的解决方案,只需使用POST,因为如果使用GET,一旦你点击第3步回到步骤2和浏览器缓存不可用,您将在旧版本的执行操作ViewModel 。 有为什么要使用获得特别的原因?



Answer 6:

我不能建议使用查询字符串值传递。 您可以使用以下之一:此代码将呈现给定model.Be确保您添加模型视图的局部视图。 而你的观点应该放在Shared文件夹

public ActionResult myaction(ViewModel model)
        {

            return PartialView("anotherView", model);
        }

另一种方式做几乎同样的事情:

 public ActionResult myaction(ViewModel model)
        {
            return View("someAnotherView", model);
        }

如果你的观点是不是在同一个控制器,使用路径视图名称,比如"../Controller/viewName"

还有一个不同的方法可以通过使用TempData的完成:

public ActionResult myaction(ViewModel model)
        {
            TempData["model"] = model;
            return RedirectToAction("someAnotherView");
        }

但你应该达到的代码视图数据如下图所示:

   @{
    ViewModel model=(ViewModel)TempData["model"];

    }

希望以上的人帮助..

问候



Answer 7:

对于Web API 2:

[HttpGet]
public ActionResult Get([FromUri]ViewModel model)
{
    // Do stuff
    return View("ViewName", model);
}


文章来源: MVC3 Model binding in HTTP GET request?