24

我认为这应该是一个更容易的任务:

编辑:

直到今天,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();
}
4

4 回答 4

61

有一种更简洁的方法可以将字符串作为模型传递到您的视图中。返回视图时,您只需要使用命名参数:

[HttpGet]
public ActionResult Index()
{
    string myStringModel = "I am passing this string as a model in the view";
    return View(model:myStringModel);
}
于 2014-04-09T15:26:32.510 回答
11

我知道你已经在这里接受了一个答案——我添加这个是因为有一个与使用字符串模型相关的一般问题。

字符串作为 MVC 中的模型类型是一场噩梦,因为如果你在控制器中这样做:

string myStringModel = "Hello world";
return View("action", myStringModel);

它最终选择了错误的重载,并将 myStringModel 作为主名称传递给视图引擎。

一般来说,正如接受的答案所描述的那样,简单地将其包装在适当的模型类型中会更容易,但您也可以View()通过将字符串强制转换为来简单地强制编译器选择正确的重载object

return View("action", (object)myStringModel);

您在这里遇到的另一个问题是使用TextBoxFor“未命名”模型存在问题 - 好吧,您不应该对此感到惊讶......使用的唯一原因TextBoxFor是确保在基础值时正确命名字段以进行绑定是模型类型的属性。在这种情况下,没有名称,因为您将它作为视图的顶级模型类型传递 - 所以您可能会争辩说您不应该首先使用TextBoxFor()它。

于 2013-05-31T10:04:36.047 回答
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()
于 2013-05-31T08:03:36.377 回答
0

您可以简单地使用View()方法的重载。

View(string ViewName, object model)

在 action 方法中,使用该签名调用 View。

return View("MyView", myString);

在 view(.cshtml) 中,将模型类型定义为字符串

@model string

然后,@Model将返回字符串(myString)。

于 2020-10-25T03:49:14.140 回答