2015-06-10 4 views
6

Я новичок в C# и espacially в ASP.NET MVC.RedirectToAction для другого контроллера и параметры передачи

У меня HomeController, который содержит этот метод:

public ActionResult Error(Error error) 
{ 
    return View(error); 
} 

Теперь у меня есть еще один контроллер, которые имеют следующую строку внутри:

return RedirectToAction("Error","Home", new { Error = (new Error("ErrorName","ErrorDescription"))}); 

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

Класс ошибки я написал сам по себе, ничего впечатляющего:

public class Error 
{ 
    public String name { get; private set; } 
    public String description { get; private set; } 
    public int number { get; private set; } 

    public Error(String name, String description) 
    { 
     this.name = name; 
     this.description = description; 
     number = 0; 
    } 
} 

Моя проблема IST, что каждый раз, когда я пытаюсь получить доступ к переменной ошибки в HomeController, это не null. У меня уже есть поисковые роботы, но я не понимаю, почему мой код не работает. Ошибок нет, только этот объект с нулевым значением. Я ценю любую помощь! :)

+0

Потому что вы 'частный set' на всех свойств (' DefaultModelBinder' не может установить свойства и вы также должны включать в себя конструктор без параметров –

+0

вы. конечно, вы можете передать [сериализованный объект] (http://stackoverflow.com/questions/7597863/passing-object-in-redirecttoaction) – lloyd

ответ

6

DefaultModelBinder не может инициализировать экземпляр или ваш класс Error на основе параметров строки запроса, поскольку у вас есть private set по всем вашим свойствам.

Ваша модель должна быть

public class Error 
{ 
    public String name { get; set; } 
    public String description { get; set; } 
    public int number { get; set; } 

    public Error() // you must add a parameter-less constructor 
    { 
    } 

    public Error(String name, String description) 
    { 
    this.name = name; 
    this.description = description; 
    // number = 0; // no need for this - the default is 0 
    } 
} 

Вы также можете использовать

return RedirectToAction("Error","Home", new { name = "ErrorName", description = "ErrorDescription"}); 

и удалить оба конструктора

+0

Спасибо вам Ответ: Я удалил 'private' и добавил конструктор без параметров, но когда я пытаюсь получить доступ к параметру в' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '', error.name; '... Вы есть какие-то другие идеи? Спасибо, пока здесь :) – Ba5t14n

+0

Какое исключение? –

+0

«NullReferenceException» выбрано в строке, потому что переменная 'error' равна« null » – Ba5t14n

0

Попробуйте использовать «ошибку» в нижнем регистре, когда вы называете анонимный параметр.

return RedirectToAction("Error","Home", new { error = (new Error("ErrorName","ErrorDescription"))}); 

Я считаю, что параметры передаются по имени, и теперь он не может связать «Error» в имени параметра вашего метода.

+0

Te 'DefaultModelBinder' не чувствителен к регистру - это не имеет никакого значения вообще –

0

Вы не можете передать сложные объекты в URL, как это. Вы должны послать его составные части:

public ActionResult YourAction() 
{ 

    // Here user object with updated data 

    return RedirectToAction("Error","Home", new { 
     name = "ErrorName", 
     description = "ErrorDescription", 
     number = 0 
    }); 
} 
+0

Конечно, вы можете передавать сложные объекты (только до тех пор, пока их свойства являются типами значений - какие OP) –

+0

Это прекрасно работает - спасибо! Но теперь я не понимаю, как компилятор знает, что он должен создать объект Error - он «смотрит» в методе HomeControllers? – Ba5t14n

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