Можно ли создать метод, не относящийся к ActionResult, для возврата ActionResult ... Или лучший / самый подходящий обходной путь? - PullRequest
1 голос
/ 09 октября 2011

У меня есть объект из базы данных, который используется во многих местах моего приложения.

Фактически точный объект немного сложен, и, особенно во время разработки, я несколько раз менял его. По этой причине я извлек метод из контроллера и создал метод, который имеет тип возвращаемого объекта.

Однако возможно, что этот объект не существует, и если бы его не было, мой код создал бы его и вернул бы его.

Например:

public ActionResult Index()
{    
    var model = GetTheObject();
    return View(model);
}

public MyComplicatedObject GetTheObject()
{
    MyComplicatedObject passback = ...database query....

    if(passback==null)
    create the object here....

    return passback;
}

Однако я больше не хочу создавать объект по умолчанию. Если он не существует, я хочу, чтобы пользователь был отправлен в представление для создания нового.

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

Я знаю, что следующее не сработает, но в идеале это то, что я хочу:

public MyComplicatedObject GetTheObject()
{
    MyComplicatedObject passback = ...database query....

    if(passback==null)
    return View("CreateObject");

    return passback;
}

Очевидно, что это не сработает.

Лучшее решение, которое я могу придумать, это в основном вернуть либо ноль, либо исключение, а затем иметь if(passback==null) & return View("CreateObject"); (в случае нуля) в ActionResult.

Однако, поскольку я хочу повторить это в нескольких местах, имеет смысл иметь возможность иметь GetTheObject() в одной строке / вызове из ActionResult и ничего больше.

Есть ли способ добиться этого?

Ответы [ 2 ]

3 голосов
/ 09 октября 2011

У меня есть похожий сценарий, в котором я хочу вернуть представление "NotFound" в случае, если мой репозиторий возвращает нулевой объект. Я реализовал вспомогательный метод ViewForModel, чтобы избежать повторения:

public ActionResult Details(int id)
{
    var model = _repository.Retrieve(id);

    return ViewForModel("Details", model);
}

public ActionResult Edit(int id)
{
    var model = _repository.Retrieve(id);

    return ViewForModel("Edit", model);
}

private ActionResult ViewForModel(string viewName, object model)
{
    return model == null
        ? View("NotFound")
        : View(viewName);
}
2 голосов
/ 09 октября 2011

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

...