【问题标题】:String as a Model字符串作为模型
【发布时间】:2013-05-26 23:52:27
【问题描述】:

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

编辑:

直到今天,Asp.Net MVC 似乎都无法为这种情况提供一个简洁的解决方案:

如果你想将一个简单的字符串作为模型传递,并且你不必定义更多的类和东西来这样做...... 有什么想法吗??

Pass simple string as a model


我在这里尝试一个简单的字符串模型。

我收到此错误:

"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();
}

【问题讨论】:

  • 您是否尝试过在返回索引操作中的视图之前初始化 CodeText? CodeText = ""; return View(Codetext);
  • @dlebech 我在构造函数中做到了
  • 您是否已经尝试过@Html.TextBox("code", Model)?我实际上不确定您是否需要为模型绑定指定一个名称才能在帖子中工作。
  • @roliu 结果:“未找到视图'索引'或其主人”

标签: asp.net-mvc asp.net-mvc-4


【解决方案1】:

要么将字符串包装在视图模型对象中:

型号:

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()

【讨论】:

  • 您创建的 ViewModel 类的新版本绝对可以工作,因为我在问之前就这样做了,这里的问题是如何简单地将字符串作为模型传递。关于你所说的重载,如果你传递给参数它不理解第二个参数是母版页或对象作为字符串,那是错误的原因。
  • @LastBye 你是对的——我没有考虑过。但是,我的其余答案仍然适用。
  • 正如我之前所说,想知道是否有一种方法可以在不实现新类的情况下做到这一点,您的最终解决方案是什么? EditorForModel 而不是 TextBoxFor? (为什么你认为这里会更好,你能根据上面的代码在这里提供一个工作的sn-p吗?
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

  • 我确实接受了这一点,因为别无选择,知道方法,这不是我想要的,你提到过:“字符串作为 MVC 中的模型类型是一场噩梦”,你呢?推荐 1.使用转换字符串作为对象或 2.使用包装器视图模型或 3.使用 EditorForModel 或什至这些的混合?我从您的详细信息 +1 中了解到,等待再次阅读时看到您的下一个答案...
  • 在逐行阅读您的答案后,因为我第一次浏览它,我可以说这是完全正确的,我想知道的是 1. 即使我去再次使用这两种方法,您认为将 textboxfor 更改为 Editor.. 是否会更好?和 2. 简单地将字符串转换为对象并以这种方式使用它的简写,你推荐这个而不是包装器方法还是包装器方法?谢谢
  • 强制转换为object,然后EditorForModel 解决方案只是我在演示或原型项目中使用的东西。也许我也可能在网站的非面向客户的部分使用它,但最终我确信它最终会变成合适的模型类型——因为这样就没有妥协。因此,如果这是一个生产网站并且需要以任何方式维护,我会选择包装类型。
  • 我是 .net 的新手,这是有效的答案,我试图在 codeschool 中应用一个示例,他们只是将模型传递给 string ,并且它正在使用 View(String, String) 使用视图名称和母版页名称创建一个 ViewResult 对象,该对象将视图呈现给响应。
【解决方案3】:

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

[HttpGet]
public ActionResult Index()
{
    string myStringModel = "I am passing this string as a model in the view";
    return View(model:myStringModel);
}

【讨论】:

  • return View("Viewname", model: stringObject);
  • 我想这应该被标记为答案,因为这个解决方案是这里所问问题的确切答案。
  • 这是我一直在寻找的答案。它是如此简单,它一直在我面前。如果您需要使用 viewname 参数使用不同的视图,则非常容易适应。
【解决方案4】:

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

View(string ViewName, object model)

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

return View("MyView", myString);

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

@model string

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2019-03-24
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多