如何让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);
}
答
在你看来,链接更改为以下:
<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);
}
如果你想不把他们作为routevalue访问模特属性,则需要发布形式提交元素,或者经由所提交:那些将被默认路由配置被照顾jQuery的。 – akerra
@akerra所以我必须改变当前持有'Url.Action'到表单发布按钮的'a'链接? –
是的,我会推荐像'更多信息'然而,您需要某种方式来了解选择哪个技术人员,因此您可能需要将隐藏div的值设置为所选技术人员的ID并将其绑定到新模型字段 – akerra