2009-09-01 2 views
1

В моем контроллере в приложении ASP.NET MVC 1 я хочу использовать UpdateModel для заполнения переменной данными POST в моем контроллере. Я просмотрел десятки примеров, но даже самые основные из них, кажется, терпят неудачу для меня.Основная проблема с Asp.net MVC UpdateModel (myClass)

Вот очень простой пример, который просто не работает. Что я делаю неправильно?

public class TestInfo 
    { 
     public string username; 
     public string email; 
    } 

    public class AdminController : Controller 
    { 

     public ActionResult TestSubmit() 
     { 
      var test = new TestInfo(); 
      UpdateModel(test);//all the properties are still null after this executes 
      //TryUpdateModel(test); //this returns true but fields/properties all null 
      return Json(test); 
     } 


    } 


//Form Code that generates the POST data 
    <form action="/Admin/TestSubmit" method="post"> 
     <div> 
      <fieldset> 
       <legend>Account Information</legend> 
       <p> 
        <label for="username">Username:</label> 
        <input id="username" name="username" type="text" value="" /> 
       </p> 
       <p> 
        <label for="email">Email:</label> 
        <input id="email" name="email" type="text" value="" /> 
       </p> 
       <p> 
        <input type="submit" value="Login" /> 
       </p> 

      </fieldset> 
     </div> 
    </form> 
+0

Спасибо за быстрые ответы ребята. Мне нравится возвращаться с обеда и видеть 4 ответа. Я тестирую их прямо сейчас. Quick side note. Я основывался на примере выше на стр. 374 Pro Asp.net MVC Framework от Стив Сандерсон и не использует заголовок [AcceptVerbs (HttpVerbs.Post)] или типизированный параметр. Неверна ли эта книга? – Glenn

+0

Выяснил это. Книга верна. Просто не следует упоминать, что в этом случае методы отражения, используемые UpdateModel, работают только для свойств, даже если они могут работать для полей, которые в настоящее время нет. Похоже на ошибку MVC для меня. Свойства, как правило, более эффективны, но для простой модели представления легче установить значения по умолчанию для полей вверху, а не переименовывать все значения свойств и задавать значения по умолчанию в конструкторе класса. – Glenn

ответ

2

делает свойство вашего общественного поля:

public class TestInfo 
    { 
     public string username {get;set;} 
     public string email{get;set;} 
    } 
+0

UpdateModel зависит от свойств, а не от полей, iirc. –

+0

ahh пропустил это. Лучшая практика, так или иначе, я думаю, – Glenn

+0

Странно, что он не работает для полей. Угадайте, что это мое наказание за то, что вы не выполняете дополнительную кодировку, необходимую для установки значений по умолчанию в конструкторе :-) – Glenn

3

Похоже, вы пытаетесь заставить контроллер обновить модель на основе элементов формы. Попробуйте вместо этого:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult TestSubmit(TestInfo test) 
    { 
     UpdateModel(test); 
     return Json(test); 
    } 

В вашем коде, вы создаете новый TestModel вместо того, чтобы позволить выполнение MVC сериализовать из HttpPost. Я также позволил себе обернуться вокруг акселя, вы не единственный!

+0

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

0

Я не слишком хорошо знаком с ASP.NET MVC, но не ваш метод TestSubmit выглядеть следующим образом:

public ActionResult TestSubmit(TestInfo test) 
{ 
    UpdateModel(test); 
    return Json(test); 
} 
-1

В контроллер должен иметь два метода, один для ответа на GET, а другой - для ответа на POST.

Итак, во-первых, есть метод GET:

public ActionResult Test() 
{ 
    return View (/* add a TestInfo instance here if you're getting it from somewhere - db etc */); 
} 

Во-вторых, вам нужен метод POST:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Test (TestInfo test) 
{ 
    return Json (test); 
} 

Обратите внимание, что нет UpdateMethod там, ModelBinder сделал бы, что для вы.

+0

Это хорошие рекомендации, но моя проблема заключалась в использовании полей. Я проверил ваше предложение, и это чистый способ разделить запросы на получение и отправку – Glenn

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