2015-12-09 3 views
0

Итак, я только начал создавать новый проект mvc. Я сделал календарь (сам по себе), который отображает дни месяца. Он имеет две кнопки, которые позволяют получить Back и Forth месяцами в году. Поэтому моя проблема в том, что я сделал для него нужный Javascript. Логика находится в Модели.Модель обновления в контроллере

Теперь каждый раз время sb. хиты, например, кнопки Forth, представление создает HttpPost, который должен отправить модель с логикой контроллеру.

Контроллер должен обновить значение и отправит «новый вид» с обновленной моделью.

Вот небольшая демонстрация, которая объясняет мою проблему более простой. В этом случае я хочу увеличивать (Model) -переменная «Number» на 1 каждый раз при sb. нажимает кнопку. Но я не хочу использовать Javascript. Это возможно.

Текущее состояние: Если я нажму кнопку Add, переменная «Число» будет увеличиваться на 1, только один раз. Впоследствии он просто ничего не делает. Каким-то образом модель действительно обновляется до представления. Что я делаю не так?

Модель

public class TestModel 
{ 
    public int Number = -10; 
} 

Посмотреть

@model MyProject.Models.TestModel 
@{ 
    Layout = null; 
} 
<!DOCTYPE html> 
<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>Index</title> 
</head> 
<body> 
    <div> 
     <h4>TestModel</h4> 
     <hr /> 
    </div> 
     @using (Html.BeginForm()) 
     { 
      @Html.DisplayFor(model => model.Number) 
      <p> 
       <input id="BtnAdd" name="myButton" type="submit" value="Add" /> 
      </p> 
     } 
</body> 
</html>  

Контроллер

public class TestController : Controller 
{ 

    public TestModel currView = new TestModel(); 
    // GET: Test 
    public ActionResult Index() 
    { 
     //Main 
     return View(currView); 
    } 


    [HttpPost] 
    public ActionResult Index(TestModel model) 
    { 
     model.Number += 1; 
     //ModelState.Clear(); 
     //Somehow the model doesnt get passed correctly 
     return View(model); 
    } 
} 

Спасибо за любую помощь! =)

ответ

2

Проблема заключается в том, что каждый раз, когда вы отправляете форму, MVC будет пытаться выполнить привязку к модели, и для этого он создаст новый объект из вас, в котором вы устанавливаете значение по умолчанию этого поля как -10. Поэтому он будет использовать это значение.

Если вы не смените это поле на объект с get и set, модельное связующее не может установить для него значение (из опубликованных данных).

Так изменить модель представления, как этот

public class TestModel 
{ 
    public int Number {set;get;}; 
} 

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

public ActionResult Index() 
{ 
    var vm=new TestModel { Number =10 };  
    return View(vm); 
} 

Когда пользователь отправляет форму, вам необходимо отправить обновленное значение Number из вашей формы снова. Сохраните значение в скрытом поле внутри вашей формы, чтобы оно было доступно с новым значением.

@using (Html.BeginForm()) 
{ 
    @Html.HiddenFor(model => model.Number) 
    @Html.DisplayFor(model => model.Number) 
    <p> 
     <input id="BtnAdd" name="myButton" type="submit" value="Add" /> 
    </p> 
} 

Кроме того, поскольку вы обновляете значение модели представления, вам нужно будет очистить словарь состояния модели. Для этого вы можете использовать метод ModelState.Clear.

[HttpPost] 
public ActionResult Index(TestModel model) 
{ 
    model.Number = model.Number +1; 
    ModelState.Clear(); 
    return View(model); 
} 
+0

Я только что внес изменения, как и я, и Slappywag. Но каким-то образом он обновляет ** только одни **. В твоем случае. Значение равно 10, и после нажатия кнопки он доходит до 11 и остается там. – C0d1ngJammer

+0

Я не касался индекса (POST). Его по-прежнему тот же метод – C0d1ngJammer

+0

@manuchao Вам нужно очистить словарь состояния модели. См. Мой обновленный ответ. – Shyju

1

Вы используете @Html.DisplayFor(model => model.Number), который не передает ваши данные обратно на контроллер. Добавьте @Html.HiddenFor(model => model.Number) в форму в представлении, а затем скрытое значение будет передано обратно контроллеру.

Согласно Documentation для Displayfor

Если свойство типизированного в качестве примитивного типа (целого числа, строки, и так далее), метод делает строку, которая представляет значение свойства.

Простая строка не будет представлена ​​в форме, тогда как скрытый ввод будет.

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