2016-05-12 3 views
1

Я разрабатываю одно приложение в ASP.NETMVCC# на каркасе .NET 4.C# MVC - Проблема маршрутизации/Confusion

Я смущен в routing, и я занимаюсь исследованием и разработал одну демо-версию. Он работает так, как я хочу, но я хочу знать, какой метод является наилучшей практикой для разработки приложения.

Сначала я зарегистрировать маршрут, как это:

routes.MapRoute(
       name: "RoutesTesting", 
       url: "{controller}/{action}/{a}/{b}/{c}/{d}/{e}", 
       defaults: new { controller = "Home", action = "Test", e = UrlParameter.Optional } 
       ); 

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

class MyClass{ 
    public string a{get;set;} 
    public string b{get;set;} 
    public string c{get;set;} 
    public string d{get;set;} 
    public string e{get;set;} 
} 

Теперь я создал методы буксировки, которые работают, чтобы найти и получить данные из URL-адреса успешно.

Метод 1:

public ActionResult Test(MyClass objMyClass){ 

} 

Метод 2:

public ActionResult Test(string a,string b,string c,string d,string e=String.Empty){ 

} 

Мой вопрос:

  1. громящей делает этот разговор в моем методе действия? Как он преобразует значения параметров в свойства объекта MyClass?

  2. Какой метод лучше всего использовать?

  3. Способ 1 будет вызывать любую ошибку или исключение, когда разговор невозможен?

Заранее спасибо ...

+0

Я думаю, что я никогда не видел хорошего URL-адреса с таким количеством '/', поэтому метод 2 - это то, что я обычно использовал для маршрута, я бы использовал только метод 1 для POST модели обратно на сервер. –

+0

Хорошо, спасибо @AshleyMedway. Таким образом, метод 2 хорош в использовании. –

+0

Хорошо, если обе работы вы можете использовать все, что хотите ... –

ответ

1

Поведение, которое вы видите, является частью привязки модели ASP.NET.Это волшебство, которое позволяет передавать через JSON объект {"firstName":"Jonathon","lastName":"Chase"} и должны автомагический быть сопоставлены с моделью Человека, который выглядит так:

public class Person { 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
} 

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

Обычно, если у вас будет метод, который будет влиять на состояние, вы должны использовать Http-глагол, отличный от Get, и отправить модель в тело запроса, а не в строку query/url. Привязка к модели позаботится о том, чтобы вы были в любом случае.

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

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

Что касается вашего последнего пункта, если параметры неверны настолько, что Маршрут не может идентифицировать действие или контроллер, вы должны получить значение 404. Однако, если у вас есть ценностный тип, который не является нулевым, как ожидаемый маршрут свойство, которое не отправлено должным образом, вы должны ожидать 500 с InvalidOperationException.

+0

У меня есть параметр 'Query Parameter' для получения записей из' Databases', а также 'Passed', что' Query Parameter' для моего представления для отображения на экране. –

+0

Спасибо, человек, теперь я пойду с «Методом 2», так как ваш «ответ» сказал, что более безопасно это использовать. –

1

Взгляните на How model binding works

громящей делает этот разговор в моем методе действия? Нравится преобразовать значения параметров в свойства объекта MyClass?

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

Какой метод лучше всего использовать?

Это упрямый вопрос. Зависит от того, какой из них подходит вашим потребностям. Рамка обрабатывает оба.

Способ 1 будет выдавать любую ошибку или исключение, когда разговор невозможно?

Модель связующего передает значение null параметру действия для свойств, которые не соответствуют.

+0

Спасибо, но если значение 'Parameter' не способно« Преобразовать »в типы свойств' matchched'? так что случилось? –

+0

@ JonathonChase объяснил, что последний пункт лучше в его ответе. – Nkosi

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