Я работаю над своим "первым" приложением MVC 3 и озадачен следующей проблемой. В основном у меня есть контактная форма, которая собирает входные данные и сохраняет в БД. На странице со списком всех представлений контактов я хочу, чтобы пользователь (в будущем это будет роль администратора) мог выбрать один контакт на странице списка контактов и нажать «Сделать клиентом», чтобы вызвать мой ClientController и преобразовать этот контакт в клиент. На странице ClientController также есть метод Create () для ввода новой записи клиента с нуля, поэтому во избежание сложности этого метода я пытаюсь создать действие «Создать», которое принимает contactID в качестве параметра.
У меня есть следующий код на странице списка контактов:
@Html.ActionLink("Make Client", "Make", "Client", new { id = item.ID }, null)
Когда клиентский контроллер выглядит следующим образом:
[HttpGet]
public ActionResult Create()
{
return View(new Client());
}
//
// GET: /Make
// used for converting a Contact record into a Client
[HttpGet]
public ActionResult Make(int contactID)
{
try
{
var contactModel = _db.Contacts.Single(r => r.ID == contactID);
var clientModel = new Client()
{
FirstName = contactModel.FirstName,
LastName = contactModel.LastName,
<snip> . . . ,
ZipCode = contactModel.ZipCode
};
return View(new Client(clientModel));
}
catch (Exception ex)
{
base.ViewData["Exception"] = "Exception: " + ex.InnerException.ToString();
throw;
}
}
Проблема в том, что контактный идентификатор, полученный в Make (int contactID), всегда равен нулю. Мне удалось настроить некоторые вещи, чтобы заставить работать следующее, вызвав стандартный Create () ActionResult с параметром int, допускающим значение nullable, но это выглядит так:
[HttpGet]
public ActionResult Create(int? id)
{
if (id == null)
{
return View(new Client());
}
else
{
return (Make(id));
}
}
Суть в том, что я могу вызывать этот Create () ActionResult, параметр не является нулевым, но когда я вызываю Make () напрямую, параметр не передается. Есть ли что-то особенное в Create (), которое делает эту работу?
Спасибо, и я открыт для других альтернатив.