0

I have a controller that returns partial views, which then are used as an Angular 2 templateUrl.

For Example:

Angular component:

@Component({
    selector: 'my-app',
    templateUrl:'/partials/index',

Controller:

 public class PartialsController : Controller
    {

        public IActionResult Index()
        {
            return PartialView();
        }
    }

Is there a way to configure the routes in such a way that Angular 2 can still get the html from the controller, but manually typing the address in a browser(www.abc.com/partials/index) returns either the default controller or "not found" instead of the partial view?

This is the current route config :

app.UseMvc(config =>
            {
                config.MapRoute(
                  name: "Default",
                  template: "{controller}/{action}/{id?}",
                  defaults: new { controller = "Home", action = "Index" }
                  );
                config.MapRoute(
                 name: "angular",
                 template: "{*anything}",
                 defaults: new { controller = "Home", action = "Index" }
                 );
            }); 

The "angular" route is needed for Angular routing to work with copy-pasting addresses from the browser.

t_tsekov
  • 177
  • 3
  • 11

1 Answers1

0

You can write an action filter to handle the situation.

 public class OnlyAjaxAttribute : ActionFilterAttribute
 {
    public OnlyAjaxAttribute()
    {

    }
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var accepts = context.HttpContext.Request.Headers["Accept"].ToString();
        if (accepts.Contains("text/html"))
        {
            context.Result = new HttpStatusCodeResult(404);
        }
        base.OnActionExecuting(context);
    }
}
[OnlyAjax]
public class PartialsController : Controller
{

    public IActionResult Index()
    {
        return PartialView();
    }
}
adem caglin
  • 22,700
  • 10
  • 58
  • 78