Asp.net mvc路由使用字符串参数而不是在CRUD操作上的Id

时间:2015-03-05 10:03:59

标签: asp.net-mvc string parameters routing crud

我需要获取带字符串名称的网址并能够编辑/更新它。

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的网址吗?

1 个答案:

答案 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并删除无效的字符。有关更多详细信息和实施,请参见此处。

https://stackoverflow.com/a/25486/387809