Я делаю учебник Nerd Dinner для ASP.NET MVC, и я встретил одну конструкцию на языке C #, которая казалась очень странной. Название этого вопроса немного расплывчато, потому что мне сложно определить, что это такое. Это также затрудняло мне поиск по теме, поэтому я решил задать вопрос об этом.
В уроке Nerd Dinner Я вижу следующий фрагмент кода:
public static class ControllerHelpers {
public static void AddRuleViolations(this ModelStateDictionary modelState, IEnumerable<RuleViolation> errors) {
foreach (RuleViolation issue in errors) {
modelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
}
}
И позже они показывают:
//
// GET: /Dinners/Edit/2
public ActionResult Edit(int id) {
Dinner dinner = dinnerRepository.GetDinner(id);
return View(dinner);
}
//
// POST: /Dinners/Edit/2
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues) {
Dinner dinner = dinnerRepository.GetDinner(id);
try {
UpdateModel(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id=dinner.DinnerID });
}
catch {
ModelState.AddRuleViolations(dinner.GetRuleViolations());
return View(dinner);
}
}
Части, которые меня озадачивают:
public static void AddRuleViolations(this ModelStateDictionary modelState, IEnumerable<RuleViolation> errors)
и
ModelState.AddRuleViolations(dinner.GetRuleViolations());
Похоже, что вы определяете функцию AddRuleViolations
в классе ControllerHelpers
, а затем вызываете ее, как если бы она была функцией экземпляра свойства ModelState
. Это наблюдение правильно? Если да, зачем вам это? Мне кажется очень странным определять метод в одном классе, как если бы он был методом другого класса.
Примечание: ModelState
является свойством текущего класса, а не самим классом.