剃刀功能查询数据库

时间:2018-11-07 17:46:13

标签: c# asp.net-mvc database razor

在此示例中,我真的很喜欢Razor函数的便利性,在该函数中它查询ASP.NET数据库以查看当前用户是否具有“标准”角色。

  Sidekiq::Testing.inline! do
    expect { worker.perform_async(sms_message.id) }.to raise_error { |error|
      expect(Rails.logger).to receive(:error).and_call_original
    }
  end

我想找到一种创建/使用类似函数的方法,该函数在“组织”数据库表中查找用户所属的组织。

我似乎找不到合适的解决方案。

2 个答案:

答案 0 :(得分:1)

您不应该将业务逻辑真正放入视图中。

解决方案取决于您要实现的目标。如果您需要检查当前用户所处的角色,我会向ViewModel添加一个属性,名为UserRoles,其中包含当前用户所处的所有角色。

ViewModel的伪代码:

public class SomethingViewModel
{
     public IReadOnlyCollection<string> UserRoles { get; set; } // could be ICollection, IList, etc. depending on your coding style

     // Other properties
}

在您的控制器中:

// this implementation is for Asp.Net Identity, use whatever implementation you need.
private IEnumerable<string> UserRoles 
    => ((ClaimsIdentity)User.Identity).Claims
            .Where(c => c.Type == ClaimTypes.Role)
            .Select(c => c.Value)


public ActionResult SomeAction()
{
     // do some processing
     var viewModel = new SomethingViewModel()
     {
         UserRoles = UserRoles.ToList()
     }
     return View(viewModel);
}

然后在“视图”中使用此属性:

@if (Model.UserRoles.Contains("Standard")) {/* do something*/}

通过这种方式,业务逻辑与视图分离,例如,如果您更改角色的存储方式,则只需简单地交换上面的属性,而不必担心查看角色的方式用于。

当然,您可能希望潜在地缓存UserRoles等,此代码只是主要思想的演示。

答案 1 :(得分:0)

谢谢大家。我最终从视图中调用RenderAction(),并在控制器内部,根据数据库结果返回了PartialView()。这使我可以根据数据库中Organization表的结果返回必要的HTML。