Как обработать null {id} на маршруте - PullRequest
5 голосов
/ 11 марта 2010

Что делать, если пользователь заходит на мой сайт с http://www.mysite.com/Quote/Edit вместо http://www.mysite.com/Quote/Edit/1000 Другими словами, они не указывают значение для {id}. Если они этого не делают, я хочу показать хорошую страницу «Не найдено», так как они не дали идентификатор. В настоящее время я справляюсь с этим, принимая значение NULL в качестве параметра в действии контроллера, и оно отлично работает. Тем не менее, мне любопытно, есть ли более стандартный MVC-способ для решения этой проблемы, а не код, который я сейчас использую (см. Ниже). Это более плавный способ справиться с этим, или это довольно хороший способ сделать это?

    [HttpGet]
    public ActionResult Edit(int? id)
    {
        if (id == null)
            return View("QuoteNotFound");

        int quoteId = (int)id;

        var viewModel = new QuoteViewModel(this.UserId);
        viewModel.LoadQuote(quoteId);
        if (viewModel.QuoteNo > 0)
        {
            return View("Create", viewModel.Quote.Entity);
        }
        else
            return View("QuoteNotFound");
    }

Ответы [ 3 ]

2 голосов
/ 11 марта 2010

Другие ваши варианты будут

  • Наличие двух Edit действий; Один с int id в качестве параметров, а другой без параметров.
  • Имея только Edit(int id) в качестве вашего действия и позволяя методу HandleUnknownAction вашего контроллера делать то, что он должен делать, когда ваша сущность не найдена (это немного сложнее).

Но мне больше нравится ваш подход, так как он прост и правильно справляется с ситуацией.

Кстати, вам не нужна эта локальная переменная, вы можете просто сделать это для лучшей читабельности:

//...
if (!id.HasValue)
    return View("QuoteNotFound");

var viewModel = new QuoteViewModel(this.UserId);
viewModel.LoadQuote(id.Value);
//...
0 голосов
/ 15 марта 2010

Использовать ограничение маршрута

Вы всегда можете определить ограничение маршрута в вашем вызове routes.MapRoute(), который не будет проходить через любые запросы с неопределенным (или не числовым) id:

new { id = "\d+" }

Это регулярное выражение, проверяющее значение id на числовое.

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

Не бойтесь использовать несколько маршрутов. В реальных приложениях это встречается довольно часто.

0 голосов
/ 12 марта 2010

Нет реальной проблемы с тем, как у вас это получается, но семантически это не совсем неверный номер кавычки, а то, что они перешли на неверный маршрут, по которому они не должны были идти.

В этом случае я бы предпочел перенаправить на / quote, и если вы действительно хотите показать сообщение пользователю, просто покажите баннер с ошибкой или аналогичный (при условии, что у вас есть эта функциональность на главной странице и т. Д.).

    public ActionResult Edit(int? id) 
    { 
        if (id == null) 
        {
            // You will need some framework in you master page to check for this message.
            TempData["error"] = "Error Message to display";
            return RedirectToAction("Index"); 
        }

        ... 
    }
...