从视图调用控制器中的方法(cshtml)



嗨,我试图从视图中从控制器调用方法只是为了显示"staff_name">

控制器

public JsonResult getStaffName(int staff_id)
{
var staffname = (from a in db.master_staff where b.staff_id == staff_id 
select a.staff_name).SingleOrDefault();
return Json(staffname,JsonRequestBehavior.AllowGet);
}

视图

int[] staff_id = { 24,25,26 }; 
@foreach (var n in staff_id){ 
//call method getStaffName from Controller to get "staff_name" 
}

它假设根据"staff_id"获得"staff_name">

对于这种情况,有什么可能的方法吗?

你可以这样做:

@Html.Action("getStaffName", "YourController", staff_id)

有关详细信息,请查看子操作:https://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx/

但是,我不知道你想用这个实现什么。

要从控制器调用方法到视图,您必须从视图使用 ajax 调用。 以下是 asp.net MVC 中的 Ajax 调用语法:

$.ajax({ 
type: "GET", 
url: '@Url.Action("controller method name", "controller name")', 
data: { searchText: value }, 
contentType: "application/json; charset=utf-8", 
dataType: 'json', 
success: function (result) { 
},
error: { 
} 
}); 
  1. 类型可以是GETPOST,具体取决于控制器方法类型。
  2. 在 URL 属性中传递两个参数,第一个是控制器方法名称,第二个是控制器名称。
  3. 在数据属性中,您必须传递从视图传入控制器所需的值,例如控制器方法中的参数。
  4. 在成功和错误属性中,您必须编写一个代码块,在这两种情况下都应该执行。 例如在成功时在 UI 上显示数据,在失败时显示错误消息。

不要这样做。这是通往黑暗面的道路:)每个 JSON 请求都需要一些时间。

  1. 创建模型来存储您的员工
  2. 在控制器中填写它(甚至在某些业务逻辑类中更好(
  3. 在视图中显示

    public ActionResult Staff()
    {
    // This would be nice to have as separate Data Access Layery class
    var staffs = GetStaffs();
    return View(staffs);
    }
    private static StaffDto[] GetStaffs()
    {
    // One call to database is better that several
    var staffs = db.master_staff
    .Where(x => x.staff_id > 0) // Any other condition, if needed
    .Select(x => new StaffDto(x.staff_id, x.staff_name))
    .ToArray();
    return staffs;
    }
    // Data Transfer Object class to separate database from presentation view
    public class StaffDto
    {
    public int StaffId { get; set; }
    public string Name { get; set; }
    public StaffDto(int staffId, string name)
    {
    StaffId = staffId;
    Name = name;
    }
    }
    

您的视图文件(在我的情况下为 Staff.cshtml(

@model IEnumerable<TestMvc.Controllers.StaffDto>
<div>
@foreach (var staff in Model)
{
@staff.Name<br />
}
</div>

而且,作为奖励,您可以轻松地对其进行单元测试

private readonly HomeController _homeController = new HomeController();
[TestMethod]
public void Staff_CheckCount()
{
var result = _homeController.Staff();
Assert.IsInstanceOfType(result, typeof(ViewResult));
var actual = ((ViewResult)result).Model as StaffDto[];
Assert.IsNotNull(actual);
Assert.AreEqual(3, actual.Length);
}

相关内容

最新更新