2013-07-05 2 views
1

К сожалению, это может быть новичку вопрос, но предположим, у меня есть пользовательский объект, который я хочу передать на мой взгляд через какое-то действие так что мой код будетВ чем причина использования частных моделей в контроллере MVC?

Private model db = new model(); 
Public Actionresult Index() 
{ 
Return View(db); 
} 

Но я также могу это сделать

Public Actionresult Index() 
{ 
db = new model(); 
Return View(db); 
} 

Является ли метод 1 просто конвенцией или у него есть какая-то причина?

+0

Ну, если 'Index()' вызывается более одного раза (я не уверен, что он есть или нет), он будет каждый раз создавать _new_ экземпляры вашей модели и возвращать разные экземпляры. Первый метод вместо этого создает одну модель и делится ею каждый раз, когда вызывается «Index()». –

+0

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

+4

Контроллеры @ChrisSinclair не используются повторно. Они всегда созданы. –

ответ

3

Как сказал в своем комментарии, есть очень мало использование первого метода. Скажем, у вас есть этот контроллер:

public class HomeController 
{ 
    public ActionResult Index() 
    { 
     return View(new Model1()); 
    } 

    public ActionResult Action1() 
    { 
     return View(new Model1()); 
    } 
} 

Затем, перемещая new Model1() в частном поле будет удалить избыточность создания в каждом действии.

public class HomeController 
{ 
    private Model1 model = new Model1(); 

    public ActionResult Index() 
    { 
     return View(model); 
    } 

    public ActionResult Action1() 
    { 
     return View(model); 
    } 
} 

Однако, если ввести этот метод:

public ActionResult Action2() 
{ 
    return View(new Model2()); 
} 

Преимуществом является спорным, так как вы будете создавать ваш Model1 даже если Action2 не нужна модель. Это так, потому что Controller s не используются повторно в MVC, они всегда создаются.

Редактировать: Чтобы развернуть это, вам необходимо знать, что для каждого запроса в Asp.Net создается новый экземпляр вашего контроллера. Это означает, что, если одно из ваших действий не вызывает другой метод, в том же экземпляре контроллера не будет вызываться два метода. Нет смысла помещать модель в личное поле. В моем примере Index и Action1 никогда не будут вызываться в том же экземпляре HomeController. Это означает, что даже если вы поместите его в личное поле, для двух действий будет создан новый объект в двух разных запросах.

0

В этом примере нет никакой разницы, либо версия вернет ссылку на новую модель.

Вы могли бы упростить еще дальше:

Public ActionResult Index() 
{ 
    Return View(new model()); 
}