我认为这应该是一项更容易的任务:
修改:
直到今天,Asp.Net MVC似乎无法在这种情况下提供一个简洁的解决方案:
如果你想传递一个简单的字符串作为一个模型,你不必定义更多的类和东西...... 任何想法??
这里我想要一个简单的字符串模型。
我收到此错误:
"Value cannot be null or empty" / "Parameter name: name"
视图:
@model string
@using (Html.BeginForm())
{
<span>Please Enter the code</span>
@Html.TextBoxFor(m => m) // Error Happens here
<button id="btnSubmit" title="Submit"></button>
}
控制器:
public string CodeText { get; set; }
public HomeController()
{
CodeText = "Please Enter MHM";
}
[HttpGet]
public ActionResult Index()
{
return View("Index", null, CodeText);
}
[HttpPost]
public ActionResult Index(string code)
{
bool result = false;
if (code == "MHM")
result = true;
return View();
}
答案 0 :(得分:45)
将字符串作为模型传递到视图中的方法更加清晰。您只需在返回视图时使用命名参数:
[HttpGet]
public ActionResult Index()
{
string myStringModel = "I am passing this string as a model in the view";
return View(model:myStringModel);
}
答案 1 :(得分:11)
我知道你已经在这里接受了答案 - 我正在添加这个,因为使用字符串模型会产生一般性问题。
作为MVC中的模型类型的字符串是一场噩梦,因为如果你在控制器中这样做:
string myStringModel = "Hello world";
return View("action", myStringModel);
最终选择了错误的重载,并将myStringModel作为主名称传递给视图引擎。
一般来说,简单地将它包装在适当的模型类型中更容易,正如接受的答案所描述的那样,但您也可以通过将字符串转换为{{View()
来强制编译器选择正确的重载object
。 1}}:
return View("action", (object)myStringModel);
您在使用TextBoxFor
时遇到“未命名”模式问题的另一个问题 - 您不应该对此感到惊讶......使用TextBoxFor
的唯一原因是当基础值是模型类型的属性时,确保为绑定正确命名字段。在这种情况下,没有名称,因为您将其作为视图的顶级模型类型传递 - 因此您可能会认为您不应该首先使用TextBoxFor()
。
答案 2 :(得分:10)
将字符串包装在视图模型对象中:
型号:
public class HomeViewModel
{
public string CodeText { get; set; }
}
控制器:
private HomeViewModel _model;
public HomeController()
{
_model = new HomeViewModel { CodeText = "My Text" };
}
[HttpGet]
public ActionResult Index()
{
return View("Index", _model);
}
查看:
@Html.TextBoxFor(m => m.CodeText);
或使用EditorForModel
:
@Html.EditorForModel()
答案 3 :(得分:0)
您可以简单地使用View()
方法的重载。
View(string ViewName, object model)
在操作方法中,使用该签名调用View。
return View("MyView", myString);
在视图(.cshtml)中,将模型类型定义为字符串
@model string
然后,@Model
将返回字符串(myString)。