جلوگیری از ورود نام Area های یکسان، در هنگام درج اطلاعات در برنامههای ASP.NET MVC 5x
نویسنده: محمد محمودی
تاریخ: ۱۳۹۸/۰۵/۳۱ ۷:۳۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
mysite.com/reporting
using System.ComponentModel.DataAnnotations;
namespace SampleProject.Models
{
public class Channel
{
public string ChannelTitle { get; set; }
[Required]
public string ChannelUrl { get; set; }
}
} using System.Collections.Generic;
namespace SampleProject.Models
{
public static class ChannelDataSource
{
static ChannelDataSource() => Channels = new List<Channel>();
public static List<Channel> Channels { get; private set; }
public static void Add(Channel channel) => Channels.Add(channel);
}
} using SampleProject.Models;
using System.Linq;
using System.Web.Mvc;
namespace SampleProject.Controllers
{
public class ChannelController : Controller
{
// GET: Channel
public ActionResult Index()
{
var channels = ChannelDataSource.Channels;
return View(channels);
}
public ActionResult Channel(string channelUrl)
{
if (string.IsNullOrWhiteSpace(channelUrl))
{
return new HttpNotFoundResult("channel not found!");
}
var channel = ChannelDataSource.Channels.SingleOrDefault(ch => ch.ChannelUrl == channelUrl.ToLower());
if (channel == null)
{
return new HttpNotFoundResult("channel not found!");
}
return View(channel);
}
public ActionResult Create() => View();
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Channel channel)
{
if (!ModelState.IsValid)
{
ModelState.AddModelError(string.Empty, "Please check your inputs!");
return View(channel);
}
ChannelDataSource.Add(channel);
TempData["Message"] = "Channel added successfully!";
return RedirectToAction(nameof(Index));
}
}
} using System.Web.Mvc;
using System.Web.Routing;
namespace SampleProject
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "ChannelUrls",
url: "{channelurl}",
defaults: new { controller = "Channel", action = "Channel", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Channel", action = "Index", id = UrlParameter.Optional }
);
}
}
} using System.Collections.Generic;
using System.Linq;
using System.Web.Routing;
namespace SampleProject.Models
{
public static class Utility
{
public static List<string> GetAllAreaNames()
{
var areaNames = RouteTable.Routes.OfType<Route>()
.Where(d => d.DataTokens != null)
.Where(d=> d.DataTokens.ContainsKey("area"))
.Select(r => r.DataTokens["area"].ToString().ToLower())
.ToList();
return areaNames;
}
}
} using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;
using SampleProject.Models;
namespace SampleProject.CustomValidators
{
public class CheckForAreaExisting : ValidationAttribute, IClientValidatable
{
public List<string> AreaNames
{
get
{
return Utility.GetAllAreaNames();
}
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ValidationType = "checkforareaexisting",
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())
};
rule.ValidationParameters.Add("areanames", string.Join(",", AreaNames));
yield return rule;
}
public override bool IsValid(object value)
{
if (value != null)
{
return Utility.GetAllAreaNames()
.SingleOrDefault(area => area == value.ToString().ToLower()) == null;
}
return true;
}
}
} jQuery.validator.addMethod("checkforareaexisting",
function (value, element, param) {
var isValueOneOfTheAreaNames = $.inArray(value.toLowerCase(), param.areaNames) === -1;
return isValueOneOfTheAreaNames;
});
$.validator.unobtrusive.adapters.add('checkforareaexisting', ['areanames'], function (options) {
options.rules['checkforareaexisting'] = { areaNames: options.params.areanames.split(',') };
options.messages['checkforareaexisting'] = options.message;
}); <!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>_Layout</title>
<style>
</style>
</head>
<body>
<div>
@RenderBody()
</div>
<script src="~/Scripts/Jquery.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<script src="~/Scripts/CustomValidation.js"></script>
</body>
</html> using SampleProject.CustomValidators;
using System.ComponentModel.DataAnnotations;
namespace SampleProject.Models
{
public class Channel
{
public string ChannelTitle { get; set; }
[Required]
[CheckForAreaExisting(ErrorMessage = "You can't use this url for your channel!")]
public string ChannelUrl { get; set; }
}
} [HttpPost]
public ActionResult CheckForAreaExisting(string channelUrl)
{
var isValueOneOfTheAreaNames = Utility.GetAllAreaNames()
.SingleOrDefault(area => area == channelUrl.ToLower()) == null;
return Json(isValueOneOfTheAreaNames);
} using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
namespace SampleProject.Models
{
public class Channel
{
public string ChannelTitle { get; set; }
[Required]
[Remote("CheckForAreaExisting", "Channel",
ErrorMessage = "You can't use this url for your channel!",
HttpMethod = "Post")]
public string ChannelUrl { get; set; }
}
}