2016-02-11 3 views
1

Очень новый для ASP.net MVC и C# в целом. Опыт работы с PHP/NodeJS в основном, небольшая Java.C# MVC url параметр не читается

У меня есть метод в контроллере, как так:

public ActionResult ImageProcess(string fileName){ 
    string url = "http://myurl.com/images/" + fileName + ".jpg"; 
    //Code to stream the file 
} 

И когда я перейти к нему как «http://myurl.com/Home/ImageProcess/12345» Я вышвырнут ошибку 404 способом, как это пытается извлечь файл.

Если я жестко закодировать это как так ...

public ActionResult ImageProcess(string fileName){ 
    string url = "http://myurl.com/images/12345.jpg"; 
    //Code to stream the file 
} 

... Это прекрасно работает, возвращает мое обработанное изображение, как ожидалось.

Почему это происходит?

+0

У вас есть пользовательская маршрутизация (если вы не уверены, то, вероятно, нет)? – Andrei

+0

Что на самом деле бросает 404? Запрос на действие «ImageProcess» или более поздний запрос на значение «url»? В описании это звучит как последнее. Если это так, то каково значение 'url', которое вызывает ошибку? – David

+0

Так что 'fileName' возвращается как null? Не знаете, как вы пытаетесь установить параметр, но если он находится в форме, проблема может быть связана с несколькими вещами, в том числе с отсутствием ввода с именем 'fileName'. –

ответ

4

Если вы используете маршруты по умолчанию для ASP.NET MVC, исправление прост: измените значение fileName на id.

Пример:

public ActionResult ImageProcess(string id) { 
    string url = "http://myurl.com/images/" + id + ".jpg"; 
} 

В файле RouteConfig.cs вы должны увидеть что-то вроде этого:

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    namespaces: new[] { "YourProject.Controllers" } 
); 

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

Если вы хотите, параметр будет называться fileName, просто переименовать {id} в {fileName} в RouteConfig.cs, или создать новый маршрут с новым именем и по умолчанию выше маршрут по умолчанию. Но если это все, что вы делаете, вы можете также придерживаться маршрута по умолчанию и назовите параметр id в своем действии.

Другой вариант будет использовать параметр запроса, который не требует каких-либо маршрут или переменные изменения:

<a href="http://myurl.com/Home/ImageProcess?fileName=yourFileName">link text</a> 

Look here for a nice tutorial on routing.

+0

Но тогда почему бы вторая версия в вопросе работала? Подпись действия не была изменена. – David

+0

@David, потому что 'string' имеет значение NULL, поэтому оно будет иметь значение' null'. – johnnyRose

+0

Правильно, но почему же один и тот же маршрут возвращает 404 в одном случае, но не другой?Я думаю, что OP должен указать, что именно производит ошибку 404. Такая же маршрутизация будет проходить в обоих сценариях («рабочие» и «неработающие» версии). Единственное различие заключается в том, какое значение имеет значение 'fileName', но вопрос не содержит никакой информации о том, что такое значение или как оно было отправлено туда. – David

0

Либо измените значение маршрутизации, как уже было предложено @johnnyRose, либо измените URL-адрес параметра get, который позволит привязке модели найти атрибут fileName. Например:

http://myurl.com/Home/ImageProcess?fileName=12345 
Смежные вопросы