Строка как модель
Я думал, что это была бы более простая задача:
Изменить:
Кажется, что в этот день 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();
}
Ответы
Ответ 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()
Ответ 2
Там намного более чистый способ передачи строки в качестве модели в ваше представление. Вам просто нужно использовать именованные параметры при возврате вашего представления:
[HttpGet]
public ActionResult Index()
{
string myStringModel = "I am passing this string as a model in the view";
return View(model:myStringModel);
}
Ответ 3
Я знаю, что вы уже приняли ответ здесь - я добавляю это, потому что есть общая информация, связанная с использованием строковой модели.
Строка как модельный тип в MVC - это кошмар, потому что если вы сделаете это в контроллере:
string myStringModel = "Hello world";
return View("action", myStringModel);
В результате получается неправильная перегрузка и передача myStringModel в качестве имени мастера в механизм просмотра.
В общем, проще просто обернуть его в подходящий тип модели, как описывает принятый ответ, но вы также можете просто заставить компилятор выбрать правильную перегрузку View()
, введя строку в object
:
return View("action", (object)myStringModel);
Другая проблема, с которой вы столкнулись при использовании TextBoxFor
, имеющей проблемы с "неназванной" моделью - ну, вы не должны удивляться этому... Единственная причина использовать TextBoxFor
- обеспечить поля названы правильно для привязки, когда базовое значение является свойством типа модели. В этом случае имя отсутствует, потому что вы передаете его как тип модели верхнего уровня для представления, поэтому вы можете утверждать, что не следует использовать TextBoxFor()
в первую очередь.