如何让View通过ViewModel将ID返回给控制器?

问题描述:

我目前有一个视图,它通过TechnicianViewModel返回IEnumerable技术人员集合。视图模型填充良好并正确显示对象。如何让View通过ViewModel将ID返回给控制器?

但是,此刻我需要有人指导我选择特定技术人员的正确方向。

如果我在技术人员上点击More Info,将会启动一个[HttpGet]请求,这将导致queryString。而这正是在这一项目的要求(该项目的要求:没有查询字符串应该出现在URL)

这里是视图: -

@model IEnumerable<ActionAugerMVC.ViewModels.TechnicianViewModel> 
    <div class="row"> 
     @foreach (var item in Model) 
     { 
      <div class="col-sm-6 col-md-3"> 
       <div class=""> 
        <div class=""> 
         <div class=""> 
          @item.UserName 
         </div> 
         <div class=""> 
          Technician 
         </div> 
        </div> 
        <div class=""> 
         <img src="~\[email protected]()" class="img-responsive" alt="..."> 
        </div> 
        <div class=""> 
         <p class="overlay__desc"> 
          @item.Bio 
         </p> 
         <ul class="overlay__social"> 
          <li><a href="#"><i class="ion-social-twitter"></i></a></li> 
          <li><a href="#"><i class="ion-social-facebook"></i></a></li> 
          <li><a href="#"><i class="ion-social-skype"></i></a></li> 
          <li><a href="#"><i class="ion-social-whatsapp-outline"></i></a></li> 
         </ul> 
         <a href="@Url.Action("Profile","Technician",new { url = item.GenerateURL() })" class="btn btn-accent">More info</a> 


        </div> 
       </div> 
      </div> 
     } 
     </div> <!--/.row --> 

这里是视图模型: -

public class TechnicianViewModel 
{ 
public Guid ID { get; set; } 
public string UserName { get; set; } 
public string Bio { get; set; } 
public string GenerateName() 
{ 
    string str = GenerateURL(); 
    str = str + ".jpg"; 
    return str; 
} 
public string GenerateURL() 
{ 
    string phrase = string.Format("{0}", UserName); 
    string str = phrase.ToLower(); 
    str = Regex.Replace(str, @"\s", "-"); 
    return str; 
} 
} 

如何避免我的控制方法是一种[HttpGet],因为我曾在这里实现,这样我可以有一个由视图返回的视图模型对象的ID。

 [HttpGet] 
    [Route("technician/profile/calgary-{url}")] 
    public IActionResult Profile(Guid? ID,string url) 
    { 
     var Profile = unitOfWork.TechnicianRepository.GetByGuidId(ID); 
     return View(Profile); 
    } 
+0

如果你想不把他们作为routevalue访问模特属性,则需要发布形式提交元素,或者经由所提交:那些将被默认路由配置被照顾jQuery的。 – akerra

+0

@akerra所以我必须改变当前持有'Url.Action'到表单发布按钮的'a'链接? –

+0

是的,我会推荐像'更多信息'然而,您需要某种方式来了解选择哪个技术人员,因此您可能需要将隐藏div的值设置为所选技术人员的ID并将其绑定到新模型字段 – akerra

在你看来,链接更改为以下:

<a href="@Url.Action("Profile","Technician",new { id = item.ID.ToString() })" class="btn btn-accent">More info</a> 

你可以摆脱你的控制方法和HTTPGET路线装饰的。

public ActionResult Profile(string id) 
{ 
    TempData["guid"] = id; 
    return RedirectToAction("Profile"); 
} 

public ActionResult Profile() 
{ 
    Guid guid = Guid.Parse(TempData["guid"]); 
    var Profile = unitOfWork.TechnicianRepository.GetByGuidId(guid); 
    return View(Profile); 
} 
+0

会阻止ID出现在URL中吗? –

+0

为什么你不想在URL中的ID? –

+0

尝试使用TempData在清理URL的同时传递GUID的上述内容 – akerra