gpt4 book ai didi

c# - 为什么模型绑定(bind)器需要一个空的构造函数

转载 作者:太空狗 更新时间:2023-10-30 00:31:09 24 4
gpt4 key购买 nike

我需要一些基础知识方面的帮助...

我有一个 Controller ,它通过一个类的实例来提供我的 View (至少我认为它是这样工作的)。所以既然我给我的 View 一个新的对象实例,为什么它必须为我的回发创建一个新的模型绑定(bind)?请看下面的例子。

[HttpGet]
public ActionResult Index(){
int hi = 5;
string temp = "yo";
MyModel foo = new MyModel(hi, temp);
return View(foo);
}
[HttpPost]
public ActionResult Index(MyModel foo){
MyModel poo = foo;
if(poo.someString == laaaa)
return RedirctToAction("End", "EndCntrl", poo);
else
throw new Exception();
}

View:
@model myApp.models.MyModel

@html.EditorFor(m => m.hi)
<input type="submit" value="hit"/>

Model:
public class MyModel {
public int hi {get; set;}
public string someString {get; set;}
public stuff(int number, string laaaa){
NumberforClass = number;
someString = laaaa;
}
}

为什么我需要一个空白的构造函数?此外,如果我有一个无参数构造函数,为什么在我到达 RedirctToAction("End", "EndCntrl", poo)poo.someString 会发生变化?

最佳答案

Why do I need a blank constructor?

因为

[HttpPost] 
public ActionResult Index(MyModel foo){ ... }

您要求 Binder 在 Post 上为您提供一个具体实例,因此 Binder 需要为您创建该对象。您的原始对象不会在 GET 和 POST 操作之间持续存在,只有(部分)它的属性作为 HTML 字段存在。这就是“HTTP 是无状态的”的意思。

使用较低级别时会变得更加明显

[HttpPost] 
public ActionResult Index(FormCollection collection)
{
var Foo = new MyModel();
// load the properties from the FormCollection yourself
}

why would poo.someString change by the time I got to RedirctToAction("End", "EndCntrl", poo)?

因为 someString 没有在您的 View 中使用。所以当你拿回新模型时它总是空白的。要改变它:

@model myApp.models.MyModel    
@html.HiddenFor(m => m.SomeString)

@html.EditorFor(m => m.hi)
<input type="submit" value="hit"/>

这会将值作为隐藏字段存储在 HTML 中,并会在 POST 上为您恢复。

关于c# - 为什么模型绑定(bind)器需要一个空的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29857728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com