如何从 mvc 控制器触发 html href 事件
How to trigger a html href event from a mvc controller
我有一个添加了 Angular 的 MVC 项目。我正在使用 ngRoute 进行路由。除了一些剃须刀视图外,一切都很好。特别是需要将所选对象的 ID 传递给下一个视图的视图。因此,当我管理用户并单击编辑或详细信息时,我需要该控制器 return 模拟 html href 事件。不确定这是否可能。欢迎就其他方法提出任何建议。
@Html.ActionLink("Edit", "Edit", new { id = item.Id })
管理员控制器
// GET: /Users/Edit/1
public async Task<ActionResult> Edit(string id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var user = await UserManager.FindByIdAsync(id);
if (user == null)
{
return HttpNotFound();
}
var userRoles = await UserManager.GetRolesAsync(user.Id);
return View(new EditUserViewModel()
{
Id = user.Id,
UserName = user.UserName,
Email = user.Email,
CompanyName = user.CompanyName,
Name = user.Name,
RolesList = RoleManager.Roles.ToList().Select(x => new SelectListItem()
{
Selected = userRoles.Contains(x.Name),
Text = x.Name,
Value = x.Name
})
});
}
我需要通过 angular 以某种方式路由它,例如用户创建页面
<a href="#!/usersAdminCreate"><span class="nav-label">Add User</span></a>
如果您有 angular,则无需在 MVC 中执行此操作。您单击以编辑的项目可以将对象作为对象传递给下一个视图或服务。它将成为 http 上下文的一部分。从您的表单中,您可以将一个函数调用到您的 angular 控制器中,然后该控制器会将对象传递给 angular 服务,然后调用 webapi。对象的上下文将传递给 API 控制器。
从您的 angular 控制器,您可以设置类似于:
app.controller('myCtrlr', function($scope, myService){
$scope.edit = yourservicename.edit(item);
});
然后从您的 angular 服务中您可以这样调用
function edit(item) {
return $http.post('apiroute/edit/', item , {
}).then(function (response) {
return response.data;
});
};
如果调用成功,它将 return 更新后的对象发送到控制器,以便您可以根据需要更新并重新绑定 UI。
您可以使用以下方法从您的控制器中检索对象上下文:
[Route ("apiroute/edit/")]
[HttpPost]
public yourModel Edit([FromBody]YourModel item)
{
YourModel result = new YourModel();
//.... do stuff
return result;
}
作为参考,我建议将其包装在 IHttpActionResult 中,这样您就可以 return 一个很好的错误响应。
如果您不想使用 angular,我建议研究一下如何 bootstrap 使用 MVC 控制器的视图 angular。这将允许您将数据预加载到可以根据需要绑定到 angular 的视图中。如果您不熟悉这种方法,Here 是一个很好的 link 入门方法。
希望对您有所帮助。
我有一个添加了 Angular 的 MVC 项目。我正在使用 ngRoute 进行路由。除了一些剃须刀视图外,一切都很好。特别是需要将所选对象的 ID 传递给下一个视图的视图。因此,当我管理用户并单击编辑或详细信息时,我需要该控制器 return 模拟 html href 事件。不确定这是否可能。欢迎就其他方法提出任何建议。
@Html.ActionLink("Edit", "Edit", new { id = item.Id })
管理员控制器
// GET: /Users/Edit/1
public async Task<ActionResult> Edit(string id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var user = await UserManager.FindByIdAsync(id);
if (user == null)
{
return HttpNotFound();
}
var userRoles = await UserManager.GetRolesAsync(user.Id);
return View(new EditUserViewModel()
{
Id = user.Id,
UserName = user.UserName,
Email = user.Email,
CompanyName = user.CompanyName,
Name = user.Name,
RolesList = RoleManager.Roles.ToList().Select(x => new SelectListItem()
{
Selected = userRoles.Contains(x.Name),
Text = x.Name,
Value = x.Name
})
});
}
我需要通过 angular 以某种方式路由它,例如用户创建页面
<a href="#!/usersAdminCreate"><span class="nav-label">Add User</span></a>
如果您有 angular,则无需在 MVC 中执行此操作。您单击以编辑的项目可以将对象作为对象传递给下一个视图或服务。它将成为 http 上下文的一部分。从您的表单中,您可以将一个函数调用到您的 angular 控制器中,然后该控制器会将对象传递给 angular 服务,然后调用 webapi。对象的上下文将传递给 API 控制器。
从您的 angular 控制器,您可以设置类似于:
app.controller('myCtrlr', function($scope, myService){
$scope.edit = yourservicename.edit(item);
});
然后从您的 angular 服务中您可以这样调用
function edit(item) {
return $http.post('apiroute/edit/', item , {
}).then(function (response) {
return response.data;
});
};
如果调用成功,它将 return 更新后的对象发送到控制器,以便您可以根据需要更新并重新绑定 UI。
您可以使用以下方法从您的控制器中检索对象上下文:
[Route ("apiroute/edit/")]
[HttpPost]
public yourModel Edit([FromBody]YourModel item)
{
YourModel result = new YourModel();
//.... do stuff
return result;
}
作为参考,我建议将其包装在 IHttpActionResult 中,这样您就可以 return 一个很好的错误响应。
如果您不想使用 angular,我建议研究一下如何 bootstrap 使用 MVC 控制器的视图 angular。这将允许您将数据预加载到可以根据需要绑定到 angular 的视图中。如果您不熟悉这种方法,Here 是一个很好的 link 入门方法。
希望对您有所帮助。