2013-10-01 2 views
3

У меня есть класс модели, который идет какMVC модель привязки - Сохранение значений во время частичного редактирования

public class Mod 
{ 
    public string StaticProp1 {get; set;} 
    public string StaticProp2 {get; set;} 

    public string EditableProp1 {get; set;} 
} 

Я хочу, чтобы представление, в котором я могу редактировать EditableProp1 но где StaticProp1, StaticProp2 отображаются, но не редактируемые.

Я создал строго типизированный:

@model Mod 

@using (Html.BeginForm()) 
{ 
    <p>@Model.StaticProp1</p> 
    <p>@Model.StaticProp2</p> 

    @Html.TextBoxFor(m => m.EditableProp1) 

    <input type="submit" value="Save" /> 
} 

В моем контроллере, когда я имею дело с действием я считаю штраф EditableProp1.

[HttpPost] 
public ActionResult Edit(Mod model, FormCollection collection) 
{ 
    string editableProp = model.EditableProp1; //This works fine 

    string staticProp1 = model.StaticProp1; //Missing 

    return View(model); 
} 

Это вызывает проблемы, если я отправляю назад по какой-то причине, как staticProp1 теперь будет нулевым, и вид не сможет отобразить его.

Я знаю, что я могу добавить

@Html.HiddenFor(m => m.StaticProp1) 
@Html.HiddenFor(m => m.StaticProp2) 

на мой взгляд, и что он будет работать нормально, но мне интересно, если есть другой способ лучше.

Мои значения уже представлены на форме (<p>@Model.StaticProp1</p>). Есть ли способ привязать модель к не редактируемым тэгам? Есть ли помощник HTML, который делает что-то вроде этого?

Кстати, если это не очевидно, я только начинаю с MVC, поэтому, если я полностью пропущу точку, пожалуйста, дайте мне знать!

+0

Если 'StaticProp' приходит из базы данных или что-то, вы можете прочитайте их снова и установите данные модели в методе обратной передачи – Shoe

+2

Почему именно вы хотите избежать HiddenFor? Это обычное дело. –

+0

Я хотел избежать этого, потому что их очень мало (моя модель более сложна, чем я показал здесь). Просто казалось, что они загромождали представление, и, поскольку ценности уже в форме, я подумал, что, возможно, был другой путь. Что-то вроде @ Html.LiteralFor (...) –

ответ

2

Каждое свойство модели, которую вы хотите сохранить, должно быть в форме (в редакторе или в скрытом поле). Вы можете использовать, как вы предлагаете, Html.HiddenFor(). Если вы хотите избежать перегрузки вашего представления с помощью скрытых полей, вы можете сохранить только идентификатор объекта в скрытом поле и извлечь остальную часть данных на основе идентификатора в действии Post. Или используйте Html.TextBoxFor() с атрибутом readonly, см. this question для получения дополнительной информации об этом (мне нравится подход во втором ответе).

+0

Я считаю, что отключенный атрибут приведет к тому, что поле не будет опубликовано, что в настоящее время является его проблемой. Атрибут readonly - тот, который он хочет. –

+0

Это имеет смысл, я думаю, что атрибут 'readonly' - это способ пойти действительно. Я добавил связанный с этим вопрос. –

+1

Спасибо, согласен работать нормально. Я просто хотел убедиться, что у меня не было ничего очевидного, что, похоже, не так. –

1

Я думаю, что этот вопрос больше касается привязки к модели и того, как она работает. Если вы не хотите использовать скрытое поле здесь (который я думаю, что подходит вашему сценарию), вы можете пользовательские модели Bind наследуя класс от:

DefaultModelBinder 
Смежные вопросы