我需要获取带字符串名称的网址并能够编辑/更新它。
public class Person
{
public int Id {get; set;}
public string Name { get; set; }
public string LastName { get; set; }
public string City { get; set; }
}
控制器
public ActionResult Edit(int id)
{
var person = _personService.Find(id);
PersonViewModel model = Mapper.Map<Person, PersonViewModel>(person);
return PartialView("_Edit", model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(PersonViewModel model)
{
if (ModelState.IsValid)
{
var person = _personService.Find(model.Id);
person.Id = model.Id;
person.Name = model.Name;
person.LastName = model.LastName;
person.City = model.City;
_personService.Update(person);
_uow.SaveChanges();
return RedirectToAction("Index");
}
return PartialView("_Edit", model);
}
查看
<div id="myModal" class="modal fade in">
<div class="modal-dialog">
<div class="modal-content">
<div id="myModalContent"></div>
</div>
</div>
</div>
<div class="pull-right">@Html.ActionLink(" ", "Add", "Person", null, new { data_modal = "", id = "btnCreate", @class = "btn btn-md glyphicon glyphicon-plus" })</div>
@foreach(var person in Model)
{
<p>@person.Name</p>
<p>@person.LastName</p>
<p>@person.City</p>
@Html.ActionLink(" ", "Edit", "Person", new { id = person.Id}, new { data_modal = "", @class = "btn btn-danger btn-sm glyphicon glyphicon-edit" })
}
当我这样使用时没有问题。 url是localhost / Person / Edit / 1。
我想获得像localhost / Person / Edit / John这样的url。并且有关详细信息,请查看url必须是localhost / Person / John而不是Person / Deatils / John。
在域模型中,我删除Id列,然后将Name列设为primary [Key]。在我的存储库中使用FindByName(name),在操作和编辑(字符串名称) context.MapRoute( &#34;人&#34 ;, &#34;人/ {动作} / {名称}&#34 ;, new {controller =&#34; Person&#34;,action =&#34; Index&#34;} );在路由配置中,我可以实现这一点。但我无法编辑名称列,因为它是主键。我需要名字可编辑。那么我可以使用Id列作为键,这样我可以编辑/更新名称,就像在我的第一种情况下一样没有问题,但是使用像Edit / John这样没有id的网址吗?
答案 0 :(得分:0)
您需要在URL中使用某种形式的唯一值。想象一下,如果你有一个以上的约翰?
如果您不介意使用/Person/Edit/1/John
然后,针对您的给定方案(未经测试)..
public class Person
{
[Key]
public int Id {get; set;}
public string Name { get; set; }
public string LastName { get; set; }
public string City { get; set; }
}
添加路线:
context.MapRoute( "Person", "Person/{action}/{id}/{name}", new { controller = "Person", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional} );
动作:
public ActionResult Edit(int id, string name)
{
var person = _personService.Find(id);
// Optional, but you may want to ensure the Url is correct. of if name is
// missing add it.
if(string.IsNullOrEmpty(name) || (person.Name.ToUrlFriendly() != name.ToUrlFriendly()))
{
return RedirectToRoute(..... new {id = person.Id, name = person.Name.ToUrlFirendly() });
}
PersonViewModel model = Mapper.Map<Person, PersonViewModel>(person);
return PartialView("_Edit", model);
}
注意ToUrlFriendly()这是为了确保URL是有效的,并且将生成类似于此的URL并删除无效的字符。有关更多详细信息和实施,请参见此处。