2015-11-02 2 views
0

Я изучаю MVC, и я пытаюсь понять, как получить доступ к ViewModel на уровне контроллера.Как получить доступ к ViewModel на контроллере

Мой вопрос в том, как мне получить доступ к ViewModel в MethodTwo?

  • Должен ли я отправить ViewModel обратно в вызов AJAX?
  • Есть ли простой способ получить доступ к модели просмотра в этом методе?

Например:

ViewModel

public class MyViewModel 
{ 
    public int MyID { get; set; } 
    public string MyString { get; set; } 
    public bool MyBool { get; set; } 
} 

В контроллере у меня есть это:

public ActionResult MethodOne(int myId, string myString, bool myBool) 
{ 
    MyViewModel mvm = new MyViewModel { MyID = myId, MyString = myString,yBool = myBool }; 
    return View("MyPrint", mvm); 
} 

На моей странице MyPrint Я делаю Ajax GET (к тому же контроллеру), и я хочу получить доступ к тому же ViewModel.

public string MethodTwo() 
{ 
    // How can I access the ViewModel here??? 
    //var myString = DoStuff(MyViewModel); 
    return myString; 
} 
+0

Чтобы получить доступ к значениям модели в 'MethodTwo', вам необходимо передать их' MethodTwo'. Если вы выполняете запрос GET, это будут значения в запросе. Как выглядит запрос ajax? – markpsmith

+0

$ .ajax ({ типа: 'GET', URL: '/ Главная/MediaReach/GetPrintData', CONTENTTYPE: 'текст/html', данные: { mrpm: @model } }). Сделано (функция (результат) { $ ("# abc"). append (result); print(); }). fail (function (xhr, ajaxOptions, thrownError) { }); – PrivateJoker

+1

@JDS Используйте метод ModelBinding для получения данных в контроллере модели внутри. [Nice] (http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx) учебник здесь. –

ответ

2

Это не ясно, что вы пытаетесь достичь, но в целом, если вы хотите получить доступ к чему-то в методе, вы должны передать его в качестве параметра:

public string MethodTwo(MyViewModel model) 

Это позволило бы вы назвать его из другого действия, как:

public ActionResult MethodOne(int myId, string myString, bool myBool) 
{ 
    MyViewModel mvm = new MyViewModel { MyID = myId, MyString = myString,yBool = myBool }; 

    var result = MethodTwo(mvm); 

    return View("MyPrint", mvm); 
} 

Однако, если вы говорите на самом деле вызывать другой метод действия, который немного отличается. Если вам нужно загрузить другое действие, то для этого требуется перенаправить пользователя на это новое действие. Это также означает, что вы должны передать любые данные, которые вам нужны вместе с этим перенаправлением, и поскольку перенаправление приведет к выдаче GET-запроса, все, с чем вам нужно сыграть, это строка запроса URL-адреса, к которому вы перенаправляете. Пытаться передать весь экземпляр класса в строке запроса нецелесообразно. Вы либо должны сгладить его на пары с ключом, либо вы должны JSON закодировать его в строку, которая может быть передана, а это значит, что вы должны были бы JSON декодировать ее на другом.

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

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